Новый компонент - TRxDBGridExportSpreadSheet

Модераторы: alexs, Модераторы

Аватара пользователя
Sharfik
энтузиаст
Сообщения: 850
Зарегистрирован: 20.07.2013 01:04:30

Сообщение Sharfik »

Переписал function TRxDBGridExportSpreadSheet.DoExecTools: boolean;
Костыль получился, ибо fpspreadsheet, как я понял, при чтении не воспринимает сводные таблицы. Формулы сохранить удается, а сводные таблицы в текст превращаются.

Код: Выделить всё

function TRxDBGridExportSpreadSheet.DoExecTools: boolean;
const
  FILE_EXT: array[0..4] of string = (
    '_excel2.xls', '_excel5.xls', '.xls', '.xlsx', '.ods');
var
  P:TBookMark;
  FPN, FFN: String;

  ssfCorrect : Boolean;
  ssfType    : TsSpreadsheetFormat;
  sExt       : String;
begin
  Result:=false;
  if (not Assigned(FRxDBGrid)) or (not Assigned(FRxDBGrid.DataSource)) or (not Assigned(FRxDBGrid.DataSource.DataSet)) then
    exit;
  if FPageName = '' then
    FPN:=sPageName
  else
    FPN:=FPageName;

  FFN:=InternalGetFileName;

  FDataSet:=FRxDBGrid.DataSource.DataSet;
  FDataSet.DisableControls;
  {$IFDEF NoAutomatedBookmark}
  P:=FDataSet.GetBookmark;
  {$ELSE}
  P:=FDataSet.Bookmark;
  {$ENDIF}

  FWorkbook  := TsWorkbook.Create;
  FWorksheet := nil;
  try

    if (ressOverwriteExisting in FOptions) then
    begin
      FWorksheet := FWorkbook.AddWorksheet(FPN);
    end
    else
    begin
       {
        +Возможно перезаписывать и добавлять листы.
        +Формулы работают
        -Повреждается информация о сводных таблицах
       }
       ssfCorrect:=False;
       If FileExists(UTF8ToSys(FFN)) then
       begin
            //UTF8RPos()>0;
            sExt := UTF8LowerCase(ExtractFileExt(FFN));
            case sExt of
              '.xls':
              begin
                if UTF8Pos(FILE_EXT[0], FFN) > 0 then
                  ssfType := sfExcel2
                else
                if UTF8Pos(FILE_EXT[1], FFN) > 0 then
                  ssfType := sfExcel5
                else
                  ssfType    := sfExcel8;
                  ssfCorrect := True;
              end;
              '.xlsx':
              begin
                ssfType := sfOOXML;
                ssfCorrect := True;
              end;
              '.ods':
              begin
                ssfType := sfOpenDocument;
                ssfCorrect := True;
              end
              else
              begin
                Application.MessageBox('Unknown file format.', PChar(Application.Title),MB_ICONERROR);
              end;
            end;
       end;

       if ssfCorrect then
       begin
          FWorkbook.Options:=FWorkbook.Options+[boReadFormulas,boIgnoreFormulas];

          FWorkbook.ReadFromFile(UTF8ToSys(FFN),ssfType);
          FWorksheet := FWorkbook.GetWorksheetByName(FPN);

          if Assigned(FWorksheet) then
          begin
            FWorksheet.Clear;
          end
          else begin
            FWorksheet := FWorkbook.AddWorksheet(FPN);
          end;
          //fullCalcOnLoad - not tested
       end;
    end;

    if Assigned(FWorksheet) then
    begin
      scColorBlack:=FRxDBGrid.GridLineColor;
      FCurRow:=0;
      FFirstDataRow:=0;
      FLastDataRow:=-1;

      if ressExportTitle in FOptions then
        DoExportTitle;
      DoExportBody;

      if (ressExportFooter in FOptions) and (RxDBGrid.FooterOptions.Active) and (RxDBGrid.FooterOptions.RowCount>0) then
        DoExportFooter;

      DoExportColWidth;

      FWorkbook.WriteToFile(UTF8ToSys(FFN), True);
      Result:=true;
    end;

  finally
    FWorkbook.Free;
    {$IFDEF NoAutomatedBookmark}
    FDataSet.GotoBookmark(P);
    FDataSet.FreeBookmark(P);
    {$ELSE}
    FDataSet.Bookmark:=P;
    {$ENDIF}
    FDataSet.EnableControls;
  end;

  if Result and FOpenAfterExport then
    OpenDocument(FFN);
end; 
Аватара пользователя
alexs
долгожитель
Сообщения: 4072
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

Sharfik писал(а): 22.03.2026 18:19:00 А где то существует TRxDBGridExportSpreadSheet умеющий обрабатывать ressOverwriteExisting и не переписывающий файл экспорта? Чтобы только одну страницу заменял?
Тут надо открывать файл и добавлять страницу. Я не уверен что в существующем варианте реализации fpSpreadSheet поддерживается все возможности Calc/Excel. И что после этой операции исходный файл останется в приемлемом виде. Если сильно хочется - то написать свой вариант экспортёра достаточно легко. Там ничего сверх-сложного.
Аватара пользователя
alexs
долгожитель
Сообщения: 4072
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

Написал ответ, а потом увидел 2-е сообщение
Аватара пользователя
Sharfik
энтузиаст
Сообщения: 850
Зарегистрирован: 20.07.2013 01:04:30

Сообщение Sharfik »

Да, я решил попробовать и допилить. Но тестил только с excel по быстрому.

PS: С этой кучей сайтов хостов исходников я уже не понимаю где люди выкладывают и что. В laz 4.6 вообще RXlib вырезан. В Тюфоне в наличие, но откуда обновляют не знаю.
Ответить