LibreOffice Module sc (master)  1
datatransformation.cxx
Go to the documentation of this file.
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  */
9 
10 #include <datatransformation.hxx>
11 #include <limits>
12 #include <document.hxx>
13 #include <rtl/math.hxx>
14 #include <cmath>
15 #include <svl/zforlist.hxx>
16 #include <unotools/charclass.hxx>
17 
18 namespace {
19 
20 Date getDate(double nDateTime, const SvNumberFormatter* pFormatter)
21 {
22  Date aDate = pFormatter->GetNullDate();
23  aDate.AddDays(static_cast<sal_Int32>(::rtl::math::approxFloor(nDateTime)));
24  return aDate;
25 }
26 }
27 
28 namespace sc {
30 {
31 }
32 
34 {
35  SCROW nEndRow = MAXROW;
36 
37  return rDoc.GetLastDataRow(0, nCol, nCol, nEndRow);
38 }
39 
41  maColumns(rColumns)
42 {
43 }
44 
46 {
47 }
48 
50 {
51  for (auto& rCol : maColumns)
52  {
53  rDoc.DeleteCol(0, 0, MAXROW, 0, rCol, 1);
54  }
55 }
56 
58 {
60 }
61 
62 const std::set<SCCOL> & ColumnRemoveTransformation::getColumns() const
63 {
64  return maColumns;
65 }
66 
68  mnCol(nCol),
69  mcSeparator(cSeparator)
70 {
71 }
72 
74 {
75  rDoc.InsertCol(0, 0, MAXROW, 0, mnCol + 1, 1);
76 
77  SCROW nEndRow = getLastRow(rDoc, mnCol);
78  for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
79  {
81  rDoc.GetCellType(mnCol, nRow, 0, eType);
82  if (eType == CELLTYPE_STRING)
83  {
84  OUString aStr = rDoc.GetString(mnCol, nRow, 0);
85  sal_Int32 nIndex = aStr.indexOf(mcSeparator);
86  if (nIndex != -1)
87  {
88  rDoc.SetString(mnCol + 1, nRow, 0, aStr.copy(nIndex + 1));
89  rDoc.SetString(mnCol, nRow, 0, aStr.copy(0, nIndex));
90  }
91  }
92  }
93 }
94 
96 {
98 }
99 
101 {
102  return mnCol;
103 }
104 
106 {
107  return mcSeparator;
108 }
109 
110 MergeColumnTransformation::MergeColumnTransformation(const std::set<SCCOL>& rColumns, const OUString& rMergeString):
111  maColumns(rColumns),
112  maMergeString(rMergeString)
113 {
114 }
115 
117 {
118  if (maColumns.empty())
119  return;
120 
121  SCROW nMaxRow = 0;
122  for (auto& itr : maColumns)
123  {
124  nMaxRow = getLastRow(rDoc, itr);
125  }
126  assert(nMaxRow != -1);
127 
128  SCCOL nTargetCol = *maColumns.begin();
129 
130 
131  for (SCROW nRow = 0; nRow <= nMaxRow; ++nRow)
132  {
133  OUStringBuffer aStr = rDoc.GetString(nTargetCol, nRow, 0);
134  for (auto& itr : maColumns)
135  {
136  if (itr != nTargetCol)
137  {
138  aStr.append(maMergeString).append(rDoc.GetString(itr, nRow, 0));
139  }
140  }
141  rDoc.SetString(nTargetCol, nRow, 0, aStr.makeStringAndClear());
142  }
143 
144  for (auto& itr : maColumns)
145  {
146  if (itr == nTargetCol)
147  continue;
148 
149  rDoc.DeleteCol(0, 0, MAXROW, 0, itr, 1);
150  }
151 }
152 
154 {
156 }
157 
159 {
160  return maMergeString;
161 }
162 
163 const std::set<SCCOL> & MergeColumnTransformation::getColumns() const
164 {
165  return maColumns;
166 }
167 
169  maSortParam(rSortParam)
170 {
171 }
172 
174 {
175  rDoc.Sort(0, maSortParam, false, false, nullptr, nullptr);
176 }
177 
179 {
181 }
182 
184 {
185  return maSortParam;
186 }
187 
188 TextTransformation::TextTransformation(const std::set<SCCOL>& nCol, const TEXT_TRANSFORM_TYPE rType):
189  mnCol(nCol),
190  maType(rType)
191 {
192 }
193 
195 {
196  SCROW nEndRow = 0;
197  for(auto& rCol : mnCol)
198  {
199  nEndRow = getLastRow(rDoc, rCol);
200  }
201  assert(nEndRow != -1);
202 
203  for(auto& rCol : mnCol)
204  {
205  switch (maType)
206  {
208  {
209  for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
210  {
211  CellType eType;
212  rDoc.GetCellType(rCol, nRow, 0, eType);
213  if (eType == CELLTYPE_STRING)
214  {
215  OUString aStr = rDoc.GetString(rCol, nRow, 0);
216  rDoc.SetString(rCol, nRow, 0, ScGlobal::getCharClassPtr()->lowercase(aStr));
217  }
218  }
219  }
220  break;
222  {
223  for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
224  {
225  CellType eType;
226  rDoc.GetCellType(rCol, nRow, 0, eType);
227  if (eType == CELLTYPE_STRING)
228  {
229  OUString aStr = rDoc.GetString(rCol, nRow, 0);
230  rDoc.SetString(rCol, nRow, 0, ScGlobal::getCharClassPtr()->uppercase(aStr));
231  }
232  }
233  }
234  break;
236  {
237  for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
238  {
239  CellType eType;
240  rDoc.GetCellType(rCol, nRow, 0, eType);
241  if (eType == CELLTYPE_STRING)
242  {
243  OUString aStr = rDoc.GetString(rCol, nRow, 0);
244 
245  sal_Int32 length = aStr.getLength();
246 
247  if(length != 0)
248  aStr = aStr.replaceAt(0, 1, ScGlobal::getCharClassPtr()->uppercase(OUString(aStr[0])));
249 
250  for (sal_Int32 i = 1; i < length; i++){
251  if (aStr[i-1] == sal_Unicode(U' '))
252  {
253  aStr = aStr.replaceAt(i, 1, ScGlobal::getCharClassPtr()->uppercase(OUString(aStr[i])));
254  }
255  else
256  {
257  aStr = aStr.replaceAt(i, 1, ScGlobal::getCharClassPtr()->lowercase(OUString(aStr[i])));
258  }
259  }
260  rDoc.SetString(rCol, nRow, 0, aStr);
261  }
262  }
263  }
264  break;
266  {
267  for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
268  {
269  CellType eType;
270  rDoc.GetCellType(rCol, nRow, 0, eType);
271  if (eType == CELLTYPE_STRING)
272  {
273  OUString aStr = rDoc.GetString(rCol, nRow, 0);
274  rDoc.SetString(rCol, nRow, 0, aStr.trim());
275  }
276  }
277  }
278  break;
279  default:
280  break;
281  }
282  }
283 }
284 
286 {
288 }
289 
291 {
292  return maType;
293 }
294 
295 const std::set<SCCOL>& TextTransformation::getColumns() const
296 {
297  return mnCol;
298 }
299 
300 AggregateFunction::AggregateFunction(const std::set<SCCOL>& rColumns, const AGGREGATE_FUNCTION rType):
301  maColumns(rColumns),
302  maType(rType)
303 {
304 }
305 
307 {
308  SCROW nEndRow = 0;
309  for (auto& itr : maColumns)
310  {
311  nEndRow = getLastRow(rDoc, itr);
312  }
313  assert(nEndRow != -1);
314 
315  for (auto& rCol : maColumns)
316  {
317  switch (maType)
318  {
320  {
321  double nSum = 0;
322  for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
323  {
324  CellType eType;
325  rDoc.GetCellType(rCol, nRow, 0, eType);
326  if (eType == CELLTYPE_VALUE)
327  {
328  double nVal = rDoc.GetValue(rCol, nRow, 0);
329  nSum += nVal;
330  }
331  }
332  rDoc.SetValue(rCol, nEndRow + 1, 0, nSum);
333  }
334  break;
336  {
337  double nSum = 0;
338  for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
339  {
340  CellType eType;
341  rDoc.GetCellType(rCol, nRow, 0, eType);
342  if (eType == CELLTYPE_VALUE)
343  {
344  double nVal = rDoc.GetValue(rCol, nRow, 0);
345  nSum += nVal;
346  }
347  }
348 
349  double nAvg = nSum / (nEndRow + 1);
350  rDoc.SetValue(rCol, nEndRow + 1, 0, nAvg);
351  }
352  break;
354  {
355  double nMin = std::numeric_limits<double>::max();
356  for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
357  {
358  CellType eType;
359  rDoc.GetCellType(rCol, nRow, 0, eType);
360  if (eType == CELLTYPE_VALUE)
361  {
362  double nVal = rDoc.GetValue(rCol, nRow, 0);
363  if(nVal < nMin)
364  nMin = nVal;
365  }
366  }
367  rDoc.SetValue(rCol, nEndRow + 1, 0, nMin);
368  }
369  break;
371  {
372  double nMax = std::numeric_limits<double>::lowest();
373  for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
374  {
375  CellType eType;
376  rDoc.GetCellType(rCol, nRow, 0, eType);
377  if (eType == CELLTYPE_VALUE)
378  {
379  double nVal = rDoc.GetValue(rCol, nRow, 0);
380  if(nMax < nVal)
381  nMax = nVal;
382  }
383  }
384  rDoc.SetValue(rCol, nEndRow + 1, 0, nMax);
385  }
386  break;
387  default:
388  break;
389  }
390  }
391 }
392 
394 {
396 }
397 
399 {
400  return maType;
401 }
402 
403 const std::set<SCCOL>& AggregateFunction::getColumns() const
404 {
405  return maColumns;
406 }
407 
408 NumberTransformation::NumberTransformation(const std::set<SCCOL>& nCol,
409  const NUMBER_TRANSFORM_TYPE rType)
410  : mnCol(nCol)
411  , maType(rType)
412  , maPrecision(-1)
413 {
414 }
415 
416 NumberTransformation::NumberTransformation(const std::set<SCCOL>& nCol,
417  const NUMBER_TRANSFORM_TYPE rType, int nPrecision)
418  : mnCol(nCol)
419  , maType(rType)
420  , maPrecision(nPrecision)
421 {
422 }
423 
425 {
426  SCROW nEndRow = 0;
427  for(auto& rCol : mnCol)
428  {
429  nEndRow = getLastRow(rDoc, rCol);
430  }
431  assert(nEndRow != -1);
432 
433  for(auto& rCol : mnCol)
434  {
435  switch (maType)
436  {
438  {
439  if(maPrecision > -1)
440  {
441  for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
442  {
443  CellType eType;
444  rDoc.GetCellType(rCol, nRow, 0, eType);
445  if (eType == CELLTYPE_VALUE)
446  {
447  double nVal = rDoc.GetValue(rCol, nRow, 0);
448  rDoc.SetValue(rCol, nRow, 0, rtl::math::round(nVal, maPrecision));
449  }
450  }
451  }
452  }
453  break;
455  {
456  for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
457  {
458  CellType eType;
459  rDoc.GetCellType(rCol, nRow, 0, eType);
460  if (eType == CELLTYPE_VALUE)
461  {
462  double nVal = rDoc.GetValue(rCol, nRow, 0);
463  rDoc.SetValue(rCol, nRow, 0, rtl::math::approxCeil(nVal));
464  }
465  }
466  }
467  break;
469  {
470  for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
471  {
472  CellType eType;
473  rDoc.GetCellType(rCol, nRow, 0, eType);
474  if (eType == CELLTYPE_VALUE)
475  {
476  double nVal = rDoc.GetValue(rCol, nRow, 0);
477  rDoc.SetValue(rCol, nRow, 0, rtl::math::approxFloor(nVal));
478  }
479  }
480  }
481  break;
483  {
484  for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
485  {
486  CellType eType;
487  rDoc.GetCellType(rCol, nRow, 0, eType);
488  if (eType == CELLTYPE_VALUE)
489  {
490  double nVal = rDoc.GetValue(rCol, nRow, 0);
491  if(std::signbit(nVal))
492  rDoc.SetValue(rCol, nRow, 0, -1 * nVal);
493  }
494  }
495  }
496  break;
498  {
499  for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
500  {
501  CellType eType;
502  rDoc.GetCellType(rCol, nRow, 0, eType);
503  if (eType == CELLTYPE_VALUE)
504  {
505  double nVal = rDoc.GetValue(rCol, nRow, 0);
506  if (nVal > 0)
507  {
508  rDoc.SetValue(rCol, nRow, 0, rtl::math::log1p(nVal-1));
509  }
510  else
511  {
512  rDoc.SetString(rCol, nRow, 0, OUString());
513  }
514  }
515  }
516  }
517  break;
519  {
520  for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
521  {
522  CellType eType;
523  rDoc.GetCellType(rCol, nRow, 0, eType);
524  if (eType == CELLTYPE_VALUE)
525  {
526  double nVal = rDoc.GetValue(rCol, nRow, 0);
527  if (nVal > 0)
528  {
529  rDoc.SetValue(rCol, nRow, 0, log10(nVal));
530  }
531  else
532  {
533  rDoc.SetString(rCol, nRow, 0, OUString());
534  }
535  }
536  }
537  }
538  break;
540  {
541  for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
542  {
543  CellType eType;
544  rDoc.GetCellType(rCol, nRow, 0, eType);
545  if (eType == CELLTYPE_VALUE)
546  {
547  double nVal = rDoc.GetValue(rCol, nRow, 0);
548  rDoc.SetValue(rCol, nRow, 0, nVal * nVal * nVal);
549  }
550  }
551  }
552  break;
554  {
555  for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
556  {
557  CellType eType;
558  rDoc.GetCellType(rCol, nRow, 0, eType);
559  if (eType == CELLTYPE_VALUE)
560  {
561  double nVal = rDoc.GetValue(rCol, nRow, 0);
562  rDoc.SetValue(rCol, nRow, 0, nVal * nVal);
563  }
564  }
565  }
566  break;
568  {
569  for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
570  {
571  CellType eType;
572  rDoc.GetCellType(rCol, nRow, 0, eType);
573  if (eType == CELLTYPE_VALUE)
574  {
575  double nVal = rDoc.GetValue(rCol, nRow, 0);
576  if (!std::signbit(nVal))
577  {
578  rDoc.SetValue(rCol, nRow, 0, sqrt(nVal));
579  }
580  else
581  {
582  rDoc.SetString(rCol, nRow, 0, OUString());
583  }
584  }
585  }
586  }
587  break;
589  {
590  for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
591  {
592  CellType eType;
593  rDoc.GetCellType(rCol, nRow, 0, eType);
594  if (eType == CELLTYPE_VALUE)
595  {
596  double nVal = rDoc.GetValue(rCol, nRow, 0);
597  if (fmod(nVal, 1) == 0 && fmod(nVal, 2) == 0)
598  rDoc.SetValue(rCol, nRow, 0, 1);
599  else
600  rDoc.SetValue(rCol, nRow, 0, 0);
601  }
602  }
603  }
604  break;
606  {
607  for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
608  {
609  CellType eType;
610  rDoc.GetCellType(rCol, nRow, 0, eType);
611  if (eType == CELLTYPE_VALUE)
612  {
613  double nVal = rDoc.GetValue(rCol, nRow, 0);
614  if (fmod(nVal, 1) == 0 && fmod(nVal, 2) != 0)
615  rDoc.SetValue(rCol, nRow, 0, 1);
616  else
617  rDoc.SetValue(rCol, nRow, 0, 0);
618  }
619  }
620  }
621  break;
623  {
624  for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
625  {
626  CellType eType;
627  rDoc.GetCellType(rCol, nRow, 0, eType);
628  if (eType == CELLTYPE_VALUE)
629  {
630  double nVal = rDoc.GetValue(rCol, nRow, 0);
631  if (nVal > 0)
632  rDoc.SetValue(rCol, nRow, 0, 1);
633  else if (nVal < 0)
634  rDoc.SetValue(rCol, nRow, 0, -1);
635  else
636  rDoc.SetValue(rCol, nRow, 0, 0);
637  }
638  }
639  }
640  break;
641  default:
642  break;
643  }
644  }
645 }
646 
648 {
650 }
651 
653 {
654  return maType;
655 }
656 
658 {
659  return maPrecision;
660 }
661 
662 const std::set<SCCOL>& NumberTransformation::getColumn() const
663 {
664  return mnCol;
665 }
666 
668  const OUString& sReplaceWith)
669  : mnCol(nCol)
670  , msReplaceWith(sReplaceWith)
671 {
672 }
673 
675 {
676  if (mnCol.empty())
677  return;
678 
679  for(auto& rCol : mnCol)
680  {
681  SCROW nEndRow = getLastRow(rDoc, rCol);
682  for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
683  {
684  CellType eType;
685  rDoc.GetCellType(rCol, nRow, 0, eType);
686  if (eType == CELLTYPE_NONE)
687  {
688  // OUString aStr = rDoc.GetString(rCol, nRow, 0);
689  // if (aStr == "" || aStr.isEmpty())
690  rDoc.SetString(rCol, nRow, 0, msReplaceWith);
691  }
692  }
693  }
694 
695 }
696 
697 const std::set<SCCOL>& ReplaceNullTransformation::getColumn() const
698 {
699  return mnCol;
700 }
701 
703 {
704  return msReplaceWith;
705 }
706 
708 {
710 }
711 
713  const DATETIME_TRANSFORMATION_TYPE rType)
714  : mnCol(nCol)
715  , maType(rType)
716 {
717 }
718 
720 {
721  SCROW nEndRow = 0;
722  for(auto& rCol : mnCol)
723  {
724  nEndRow = getLastRow(rDoc, rCol);
725  }
726  assert(nEndRow != -1);
727 
728  for(auto& rCol : mnCol)
729  {
730  switch (maType)
731  {
733  {
734  SvNumberFormatter* pFormatter = rDoc.GetFormatTable();
735  LanguageType eLanguage = ScGlobal::eLnge;
736  sal_uInt32 nFormat = pFormatter->GetStandardFormat( SvNumFormatType::DATE, eLanguage );
737  for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
738  {
739  CellType eType;
740  rDoc.GetCellType(rCol, nRow, 0, eType);
741  if (eType == CELLTYPE_VALUE)
742  {
743  ScAddress aAddress(rCol, nRow, 0);
744  rDoc.SetNumberFormat(aAddress, nFormat);
745  }
746  }
747  }
748  break;
750  {
751  SvNumberFormatter* pFormatter = rDoc.GetFormatTable();
752  for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
753  {
754  CellType eType;
755  rDoc.GetCellType(rCol, nRow, 0, eType);
756  if (eType == CELLTYPE_VALUE)
757  {
758  double nVal = rDoc.GetValue(rCol, nRow, 0);
759  Date aDate = getDate(nVal, pFormatter);
760  rDoc.SetValue(rCol, nRow, 0, aDate.GetYear());
761  }
762  }
763  }
764  break;
766  {
767  SvNumberFormatter* pFormatter = rDoc.GetFormatTable();
768  LanguageType eLanguage = ScGlobal::eLnge;
769  sal_uInt32 nFormat = pFormatter->GetStandardFormat( SvNumFormatType::DATE, eLanguage );
770  for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
771  {
772  CellType eType;
773  rDoc.GetCellType(rCol, nRow, 0, eType);
774  if (eType == CELLTYPE_VALUE)
775  {
776  double nVal = rDoc.GetValue(rCol, nRow, 0);
777  Date aDate = getDate(nVal, pFormatter);
778  aDate.SetDay(1);
779  aDate.SetMonth(1);
780  nVal = aDate - pFormatter->GetNullDate();
781  ScAddress aAddress(rCol, nRow, 0);
782  rDoc.SetValue(rCol, nRow, 0, nVal);
783  rDoc.SetNumberFormat(aAddress, nFormat);
784  }
785  }
786  }
787  break;
789  {
790  SvNumberFormatter* pFormatter = rDoc.GetFormatTable();
791  LanguageType eLanguage = ScGlobal::eLnge;
792  sal_uInt32 nFormat = pFormatter->GetStandardFormat( SvNumFormatType::DATE, eLanguage );
793 
794  for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
795  {
796  CellType eType;
797  rDoc.GetCellType(rCol, nRow, 0, eType);
798  if (eType == CELLTYPE_VALUE)
799  {
800  double nVal = rDoc.GetValue(rCol, nRow, 0);
801  Date aDate = getDate(nVal, pFormatter);
802  aDate.SetMonth(12);
803  aDate.SetDay(31);
804  nVal = aDate - pFormatter->GetNullDate();
805  ScAddress aAddress(rCol, nRow, 0);
806  rDoc.SetValue(rCol, nRow, 0, nVal);
807  rDoc.SetNumberFormat(aAddress, nFormat);
808  }
809  }
810  }
811  break;
813  {
814  SvNumberFormatter* pFormatter = rDoc.GetFormatTable();
815  for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
816  {
817  CellType eType;
818  rDoc.GetCellType(rCol, nRow, 0, eType);
819  if (eType == CELLTYPE_VALUE)
820  {
821  double nVal = rDoc.GetValue(rCol, nRow, 0);
822  Date aDate = getDate(nVal, pFormatter);
823  rDoc.SetValue(rCol, nRow, 0, aDate.GetMonth());
824  }
825  }
826  }
827  break;
829  {
830  SvNumberFormatter* pFormatter = rDoc.GetFormatTable();
831  LanguageType eLanguage = ScGlobal::eLnge;
832  for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
833  {
834  CellType eType;
835  rDoc.GetCellType(rCol, nRow, 0, eType);
836  if (eType == CELLTYPE_VALUE)
837  {
838  double nVal = rDoc.GetValue(rCol, nRow, 0);
839  const Color* pColor = nullptr;
840  OUString aResult;
841  pFormatter->GetPreviewStringGuess("MMMM", nVal, aResult, &pColor, eLanguage);
842  rDoc.SetString(rCol, nRow, 0, aResult);
843  }
844  }
845  }
846  break;
848  {
849  SvNumberFormatter* pFormatter = rDoc.GetFormatTable();
850  LanguageType eLanguage = ScGlobal::eLnge;
851  sal_uInt32 nFormat = pFormatter->GetStandardFormat( SvNumFormatType::DATE, eLanguage );
852  for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
853  {
854  CellType eType;
855  rDoc.GetCellType(rCol, nRow, 0, eType);
856  if (eType == CELLTYPE_VALUE)
857  {
858  double nVal = rDoc.GetValue(rCol, nRow, 0);
859  ScAddress aAddress(rCol, nRow, 0);
860  Date aDate = getDate(nVal, pFormatter);
861  aDate.SetDay(1);
862  nVal = aDate - pFormatter->GetNullDate();
863  rDoc.SetValue(rCol, nRow, 0, nVal);
864  rDoc.SetNumberFormat(aAddress, nFormat);
865  }
866  }
867  }
868  break;
870  {
871  SvNumberFormatter* pFormatter = rDoc.GetFormatTable();
872  LanguageType eLanguage = ScGlobal::eLnge;
873  sal_uInt32 nFormat = pFormatter->GetStandardFormat( SvNumFormatType::DATE, eLanguage );
874  for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
875  {
876  CellType eType;
877  rDoc.GetCellType(rCol, nRow, 0, eType);
878  if (eType == CELLTYPE_VALUE)
879  {
880  double nVal = rDoc.GetValue(rCol, nRow, 0);
881  ScAddress aAddress(rCol, nRow, 0);
882  Date aDate = getDate(nVal, pFormatter);
883  aDate.SetDay(aDate.GetDaysInMonth());
884  nVal = aDate - pFormatter->GetNullDate();
885  rDoc.SetValue(rCol, nRow, 0, nVal);
886  rDoc.SetNumberFormat(aAddress, nFormat);
887  }
888  }
889  }
890  break;
892  {
893  SvNumberFormatter* pFormatter = rDoc.GetFormatTable();
894  for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
895  {
896  CellType eType;
897  rDoc.GetCellType(rCol, nRow, 0, eType);
898  if (eType == CELLTYPE_VALUE)
899  {
900  double nVal = rDoc.GetValue(rCol, nRow, 0);
901  Date aDate = getDate(nVal, pFormatter);
902  rDoc.SetValue(rCol, nRow, 0, aDate.GetDay());
903  }
904  }
905  }
906  break;
908  {
909  SvNumberFormatter* pFormatter = rDoc.GetFormatTable();
910  for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
911  {
912  CellType eType;
913  rDoc.GetCellType(rCol, nRow, 0, eType);
914  if (eType == CELLTYPE_VALUE)
915  {
916  double nVal = rDoc.GetValue(rCol, nRow, 0);
917  Date aDate = getDate(nVal, pFormatter);
918  rDoc.SetValue(rCol, nRow, 0, aDate.GetDayOfWeek());
919  }
920  }
921  }
922  break;
924  {
925  SvNumberFormatter* pFormatter = rDoc.GetFormatTable();
926  for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
927  {
928  CellType eType;
929  rDoc.GetCellType(rCol, nRow, 0, eType);
930  if (eType == CELLTYPE_VALUE)
931  {
932  double nVal = rDoc.GetValue(rCol, nRow, 0);
933  Date aDate = getDate(nVal, pFormatter);
934  rDoc.SetValue(rCol, nRow, 0, aDate.GetDayOfYear());
935  }
936  }
937  }
938  break;
940  {
941  SvNumberFormatter* pFormatter = rDoc.GetFormatTable();
942  for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
943  {
944  CellType eType;
945  rDoc.GetCellType(rCol, nRow, 0, eType);
946  if (eType == CELLTYPE_VALUE)
947  {
948  double nVal = rDoc.GetValue(rCol, nRow, 0);
949  Date aDate = getDate(nVal, pFormatter);
950 
951  int nMonth = aDate.GetMonth();
952 
953  if(nMonth >= 1 && nMonth <=3)
954  rDoc.SetValue(rCol, nRow, 0, 1);
955 
956  else if(nMonth >= 4 && nMonth <=6)
957  rDoc.SetValue(rCol, nRow, 0, 2);
958 
959  else if(nMonth >= 7 && nMonth <=9)
960  rDoc.SetValue(rCol, nRow, 0, 3);
961 
962  else if(nMonth >= 10 && nMonth <=12)
963  rDoc.SetValue(rCol, nRow, 0, 4);
964  else
965  rDoc.SetValue(rCol, nRow, 0, -1);
966 
967  }
968  }
969  }
970  break;
972  {
973  SvNumberFormatter* pFormatter = rDoc.GetFormatTable();
974  LanguageType eLanguage = ScGlobal::eLnge;
975  sal_uInt32 nFormat = pFormatter->GetStandardFormat( SvNumFormatType::DATE, eLanguage );
976  for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
977  {
978  CellType eType;
979  rDoc.GetCellType(rCol, nRow, 0, eType);
980  if (eType == CELLTYPE_VALUE)
981  {
982  double nVal = rDoc.GetValue(rCol, nRow, 0);
983  ScAddress aAddress(rCol, nRow, 0);
984  Date aDate = getDate(nVal, pFormatter);
985 
986  int nMonth = aDate.GetMonth();
987 
988  if(nMonth >= 1 && nMonth <=3)
989  {
990  aDate.SetDay(1);
991  aDate.SetMonth(1);
992  nVal = aDate - pFormatter->GetNullDate();
993  rDoc.SetValue(rCol, nRow, 0, nVal);
994  rDoc.SetNumberFormat(aAddress, nFormat);
995  }
996  else if(nMonth >= 4 && nMonth <=6)
997  {
998  aDate.SetDay(1);
999  aDate.SetMonth(4);
1000  nVal = aDate - pFormatter->GetNullDate();
1001  rDoc.SetValue(rCol, nRow, 0, nVal);
1002  rDoc.SetNumberFormat(aAddress, nFormat);
1003  }
1004  else if(nMonth >= 7 && nMonth <=9)
1005  {
1006  aDate.SetDay(1);
1007  aDate.SetMonth(7);
1008  nVal = aDate - pFormatter->GetNullDate();
1009  rDoc.SetValue(rCol, nRow, 0, nVal);
1010  rDoc.SetNumberFormat(aAddress, nFormat);
1011  }
1012  else if(nMonth >= 10 && nMonth <=12)
1013  {
1014  aDate.SetDay(1);
1015  aDate.SetMonth(10);
1016  nVal = aDate - pFormatter->GetNullDate();
1017  rDoc.SetValue(rCol, nRow, 0, nVal);
1018  rDoc.SetNumberFormat(aAddress, nFormat);
1019  }
1020  else
1021  rDoc.SetValue(rCol, nRow, 0, -1);
1022  }
1023  }
1024  }
1025  break;
1027  {
1028  SvNumberFormatter* pFormatter = rDoc.GetFormatTable();
1029  LanguageType eLanguage = ScGlobal::eLnge;
1030  sal_uInt32 nFormat = pFormatter->GetStandardFormat( SvNumFormatType::DATE, eLanguage );
1031  for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
1032  {
1033  ScAddress aAddress(rCol, nRow, 0);
1034  CellType eType;
1035  rDoc.GetCellType(rCol, nRow, 0, eType);
1036  if (eType == CELLTYPE_VALUE)
1037  {
1038  double nVal = rDoc.GetValue(rCol, nRow, 0);
1039  Date aDate = getDate(nVal, pFormatter);
1040  int nMonth = aDate.GetMonth();
1041 
1042  if(nMonth >= 1 && nMonth <=3)
1043  {
1044  aDate.SetDay(31);
1045  aDate.SetMonth(3);
1046  nVal = aDate - pFormatter->GetNullDate();
1047  rDoc.SetValue(rCol, nRow, 0, nVal);
1048  rDoc.SetNumberFormat(aAddress, nFormat);
1049  }
1050 
1051  else if(nMonth >= 4 && nMonth <=6)
1052  {
1053  aDate.SetDay(30);
1054  aDate.SetMonth(6);
1055  nVal = aDate - pFormatter->GetNullDate();
1056  rDoc.SetValue(rCol, nRow, 0, nVal);
1057  rDoc.SetNumberFormat(aAddress, nFormat);
1058  }
1059 
1060  else if(nMonth >= 7 && nMonth <=9)
1061  {
1062  aDate.SetDay(30);
1063  aDate.SetMonth(9);
1064  nVal = aDate - pFormatter->GetNullDate();
1065  rDoc.SetValue(rCol, nRow, 0, nVal);
1066  rDoc.SetNumberFormat(aAddress, nFormat);
1067  }
1068 
1069  else if(nMonth >= 10 && nMonth <=12)
1070  {
1071  aDate.SetDay(31);
1072  aDate.SetMonth(12);
1073  nVal = aDate - pFormatter->GetNullDate();
1074  rDoc.SetValue(rCol, nRow, 0, nVal);
1075  rDoc.SetNumberFormat(aAddress, nFormat);
1076  }
1077  else
1078  rDoc.SetValue(rCol, nRow, 0, -1);
1079 
1080  }
1081  }
1082  }
1083  break;
1085  {
1086  SvNumberFormatter* pFormatter = rDoc.GetFormatTable();
1087  LanguageType eLanguage = ScGlobal::eLnge;
1088  sal_uInt32 nFormat = pFormatter->GetStandardFormat(SvNumFormatType::TIME, eLanguage);
1089  for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
1090  {
1091  ScAddress aAddress(rCol, nRow, 0);
1092  CellType eType;
1093  rDoc.GetCellType(rCol, nRow, 0, eType);
1094  if (eType == CELLTYPE_VALUE)
1095  {
1096  rDoc.SetNumberFormat(aAddress, nFormat);
1097  }
1098  }
1099  }
1100  break;
1102  {
1103  for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
1104  {
1105  CellType eType;
1106  rDoc.GetCellType(rCol, nRow, 0, eType);
1107  if (eType == CELLTYPE_VALUE)
1108  {
1109  double nVal = rDoc.GetValue(rCol, nRow, 0);
1110  sal_uInt16 nHour, nMinute, nSecond;
1111  double fFractionOfSecond;
1112  tools::Time::GetClock( nVal, nHour, nMinute, nSecond, fFractionOfSecond, 0);
1113  rDoc.SetValue(rCol, nRow, 0, nHour);
1114  }
1115  }
1116  }
1117  break;
1119  {
1120  for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
1121  {
1122  CellType eType;
1123  rDoc.GetCellType(rCol, nRow, 0, eType);
1124  if (eType == CELLTYPE_VALUE)
1125  {
1126  double nVal = rDoc.GetValue(rCol, nRow, 0);
1127  sal_uInt16 nHour, nMinute, nSecond;
1128  double fFractionOfSecond;
1129  tools::Time::GetClock( nVal, nHour, nMinute, nSecond, fFractionOfSecond, 0);
1130  rDoc.SetValue(rCol, nRow, 0, nMinute);
1131  }
1132  }
1133  }
1134  break;
1136  {
1137  for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
1138  {
1139  CellType eType;
1140  rDoc.GetCellType(rCol, nRow, 0, eType);
1141  if (eType == CELLTYPE_VALUE)
1142  {
1143  double nVal = rDoc.GetValue(rCol, nRow, 0);
1144  sal_uInt16 nHour, nMinute, nSecond;
1145  double fFractionOfSecond;
1146  tools::Time::GetClock( nVal, nHour, nMinute, nSecond, fFractionOfSecond, 0);
1147  rDoc.SetValue(rCol, nRow, 0, nSecond);
1148  }
1149  }
1150  }
1151  break;
1152  default:
1153  break;
1154  }
1155  }
1156 }
1157 
1159 {
1161 }
1162 
1164 {
1165  return maType;
1166 }
1167 
1168 const std::set<SCCOL>& DateTimeTransformation::getColumn() const
1169 {
1170  return mnCol;
1171 }
1172 
1173 }
1174 
1175 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
virtual void Transform(ScDocument &rDoc) const override
void DeleteCol(SCROW nStartRow, SCTAB nStartTab, SCROW nEndRow, SCTAB nEndTab, SCCOL nStartCol, SCSIZE nSize, ScDocument *pRefUndoDoc=nullptr, bool *pUndoOutline=nullptr, const ScMarkData *pTabMark=nullptr)
Definition: document.cxx:1584
DATETIME_TRANSFORMATION_TYPE getDateTimeTransformationType() const
virtual void Transform(ScDocument &rDoc) const override
OUString maType
const std::set< SCCOL > & getColumns() const
AGGREGATE_FUNCTION maType
sal_Int32 nIndex
DayOfWeek GetDayOfWeek() const
TEXT_TRANSFORM_TYPE getTextTransformationType() const
static SCROW getLastRow(const ScDocument &rDoc, SCCOL nCol)
virtual void Transform(ScDocument &rDoc) const override
const std::set< SCCOL > & getColumn() const
virtual TransformationType getTransformationType() const override
NUMBER_TRANSFORM_TYPE maType
sal_Int32 mnCol
virtual void Transform(ScDocument &rDoc) const override
const std::set< SCCOL > & getColumn() const
virtual TransformationType getTransformationType() const override
const std::set< SCCOL > & getColumns() const
bool InsertCol(SCROW nStartRow, SCTAB nStartTab, SCROW nEndRow, SCTAB nEndTab, SCCOL nStartCol, SCSIZE nSize, ScDocument *pRefUndoDoc=nullptr, const ScMarkData *pTabMark=nullptr)
Definition: document.cxx:1497
virtual void Transform(ScDocument &rDoc) const override
const OUString & getMergeString() const
SC_DLLPUBLIC void SetValue(SCCOL nCol, SCROW nRow, SCTAB nTab, const double &rVal)
Definition: document.cxx:3456
const ScSortParam & getSortParam() const
ReplaceNullTransformation(const std::set< SCCOL > &nCol, const OUString &sReplaceWith)
virtual void Transform(ScDocument &rDoc) const override
void Sort(SCTAB nTab, const ScSortParam &rSortParam, bool bKeepQuery, bool bUpdateRefs, ScProgress *pProgress, sc::ReorderParam *pUndo)
Sort a range of data.
Definition: documen3.cxx:1420
AGGREGATE_FUNCTION getAggregateType() const
TEXT_TRANSFORM_TYPE maType
sal_uInt16 sal_Unicode
virtual TransformationType getTransformationType() const override
const BorderLinePrimitive2D *pCandidateB assert(pCandidateA)
MergeColumnTransformation(const std::set< SCCOL > &rColumns, const OUString &rMergeString)
sal_uInt16 GetMonth() const
length
const SCROW MAXROW
Definition: address.hxx:69
SC_DLLPUBLIC OUString GetString(SCCOL nCol, SCROW nRow, SCTAB nTab, const ScInterpreterContext *pContext=nullptr) const
Definition: document.cxx:3484
virtual TransformationType getTransformationType() const override
virtual ~ColumnRemoveTransformation() override
SC_DLLPUBLIC double GetValue(const ScAddress &rPos) const
Definition: document.cxx:3626
DocumentType eType
DATETIME_TRANSFORMATION_TYPE
sal_Int16 GetYear() const
virtual void Transform(ScDocument &rDoc) const override
const std::set< SCCOL > & getColumn() const
SC_DLLPUBLIC bool SetString(SCCOL nCol, SCROW nRow, SCTAB nTab, const OUString &rString, const ScSetStringParam *pParam=nullptr)
Definition: document.cxx:3361
SC_DLLPUBLIC SvNumberFormatter * GetFormatTable() const
Definition: documen2.cxx:437
sal_uInt16 GetDaysInMonth() const
int i
void SetDay(sal_uInt16 nNewDay)
SplitColumnTransformation(SCCOL nCol, sal_Unicode cSeparator)
virtual TransformationType getTransformationType() const override
sal_Int16 SCCOL
Definition: types.hxx:22
virtual void Transform(ScDocument &rDoc) const override
virtual TransformationType getTransformationType() const override
ColumnRemoveTransformation(const std::set< SCCOL > &rColumns)
virtual void Transform(ScDocument &rDoc) const override
sal_uInt16 GetDay() const
void AddDays(sal_Int32 nAddDays)
static SC_DLLPUBLIC LanguageType eLnge
Definition: global.hxx:548
DateTimeTransformation(const std::set< SCCOL > &nCol, const DATETIME_TRANSFORMATION_TYPE rType)
NUMBER_TRANSFORM_TYPE getNumberTransformationType() const
NumberTransformation(const std::set< SCCOL > &nCol, const NUMBER_TRANSFORM_TYPE rType)
void SetNumberFormat(const ScAddress &rPos, sal_uInt32 nNumberFormat)
Definition: document.cxx:3687
std::set< SCCOL > maColumns
sal_Int32 SCROW
Definition: types.hxx:18
static void GetClock(double fTimeInDays, sal_uInt16 &nHour, sal_uInt16 &nMinute, sal_uInt16 &nSecond, double &fFractionOfSecond, int nFractionDecimals)
CellType
Definition: global.hxx:282
DATETIME_TRANSFORMATION_TYPE maType
sal_uInt32 GetStandardFormat(SvNumFormatType eType, LanguageType eLnge=LANGUAGE_DONTKNOW)
bool GetPreviewStringGuess(const OUString &sFormatString, double fPreviewNumber, OUString &sOutString, const Color **ppColor, LanguageType eLnge=LANGUAGE_DONTKNOW)
static SC_DLLPUBLIC const CharClass * getCharClassPtr()
Definition: global.cxx:1011
AggregateFunction(const std::set< SCCOL > &rColumns, const AGGREGATE_FUNCTION rType)
SCROW GetLastDataRow(SCTAB nTab, SCCOL nCol1, SCCOL nCol2, SCROW nLastRow) const
Return the last non-empty row position in given columns that's no greater than the initial last row p...
Definition: document.cxx:1083
const std::set< SCCOL > & getColumns() const
SortTransformation(const ScSortParam &rParam)
virtual TransformationType getTransformationType() const override
const OUString & getReplaceString() const
sal_uInt16 GetDayOfYear() const
const std::set< SCCOL > & getColumns() const
virtual TransformationType getTransformationType() const override
const Date & GetNullDate() const
virtual TransformationType getTransformationType() const override
TextTransformation(const std::set< SCCOL > &nCol, const TEXT_TRANSFORM_TYPE rType)
aStr
void SetMonth(sal_uInt16 nNewMonth)
SC_DLLPUBLIC void GetCellType(SCCOL nCol, SCROW nRow, SCTAB nTab, CellType &rCellType) const
Definition: document.cxx:3745