diff --git a/components/fpspreadsheet/examples/ooxmldemo/ooxmlwrite.lpr b/components/fpspreadsheet/examples/ooxmldemo/ooxmlwrite.lpr index 521bb7ec2..0354d2c16 100644 --- a/components/fpspreadsheet/examples/ooxmldemo/ooxmlwrite.lpr +++ b/components/fpspreadsheet/examples/ooxmldemo/ooxmlwrite.lpr @@ -36,6 +36,9 @@ begin MyWorksheet.WriteUTF8Text(0, 26, 'AA'); // Test for column name + MyWorksheet.WriteColWidth(0, 20); + MyWorksheet.WriteRowHeight(0, 4); + // Uncomment this to test large XLS files for i := 2 to 2{20} do begin diff --git a/components/fpspreadsheet/examples/other/test_virtualmode.lpr b/components/fpspreadsheet/examples/other/test_virtualmode.lpr index 641790f8d..93b6f1a7e 100644 --- a/components/fpspreadsheet/examples/other/test_virtualmode.lpr +++ b/components/fpspreadsheet/examples/other/test_virtualmode.lpr @@ -90,6 +90,8 @@ begin worksheet.WriteBackgroundColor(0, 0, scSilver); headerTemplate := worksheet.FindCell(0, 0); + worksheet.WriteRowHeight(0, 3); + worksheet.WriteColWidth(0, 30); { In case of a database, you would open the dataset before calling this: } workbook.WriteToFile('test_virtual.xlsx', sfOOXML, true); // workbook.WriteToFile('test_virtual.xls', sfExcel8, true); diff --git a/components/fpspreadsheet/xlsxooxml.pas b/components/fpspreadsheet/xlsxooxml.pas index 5dfdcad07..1358971a9 100755 --- a/components/fpspreadsheet/xlsxooxml.pas +++ b/components/fpspreadsheet/xlsxooxml.pas @@ -19,6 +19,9 @@ Specifications obtained from: http://openxmldeveloper.org/default.aspx +also: +http://office.microsoft.com/en-us/excel-help/excel-specifications-and-limits-HP010073849.aspx#BMworksheetworkbook + AUTHORS: Felipe Monteiro de Carvalho } unit xlsxooxml; @@ -72,6 +75,7 @@ type procedure ListAllFills; procedure ResetStreams; procedure WriteBorderList(AStream: TStream); + procedure WriteCols(AStream: TStream; ASheet: TsWorksheet); procedure WriteFillList(AStream: TStream); procedure WriteFontList(AStream: TStream); procedure WriteNumFormatList(AStream: TStream); @@ -443,6 +447,30 @@ begin ''); end; +procedure TsSpreadOOXMLWriter.WriteCols(AStream: TStream; ASheet: TsWorksheet); +var + col: PCol; + c: Integer; +begin + if ASheet.Cols.Count = 0 then + exit; + + AppendToStream(AStream, + ''); + + for c:=0 to ASheet.GetLastColIndex do begin + col := ASheet.FindCol(c); + if col <> nil then + AppendToStream(AStream, Format( + '', + [c+1, c+1, col.Width]) + ); + end; + + AppendToStream(AStream, + ''); +end; + procedure TsSpreadOOXMLWriter.WriteFillList(AStream: TStream); var i: Integer; @@ -848,9 +876,13 @@ var value: Variant; styleCell: PCell; fn: String; + row: PRow; + rh: String; + h0: Single; begin FCurSheetNum := Length(FSSheets); SetLength(FSSheets, FCurSheetNum + 1); + h0 := Workbook.GetDefaultFontSize; // Point size of default font // Create the stream if (woSaveMemory in Workbook.WritingOptions) then begin @@ -871,14 +903,23 @@ begin ''); AppendToStream(FSSheets[FCurSheetNum], ''); + + WriteCols(FSSheets[FCurSheetNum], CurSheet); + AppendToStream(FSSheets[FCurSheetNum], ''); if (woVirtualMode in Workbook.WritingOptions) and Assigned(Workbook.OnNeedCellData) then begin for r := 0 to Workbook.VirtualRowCount-1 do begin + row := CurSheet.FindRow(r); + if row <> nil then + rh := Format(' ht="%g" customHeight="1"', [ + (row^.Height + ROW_HEIGHT_CORRECTION)*h0]) + else + rh := ''; AppendToStream(FSSheets[FCurSheetNum], Format( - '', [r+1, Workbook.VirtualColCount])); + '', [r+1, Workbook.VirtualColCount, rh])); for c := 0 to Workbook.VirtualColCount-1 do begin FillChar(lCell, SizeOf(lCell), 0); CellPosText := CurSheet.CellPosToText(r, c); @@ -920,8 +961,15 @@ begin // The cells need to be written in order, row by row, cell by cell LastColIndex := CurSheet.GetLastColIndex; for r := 0 to CurSheet.GetLastRowIndex do begin + // If the row has a custom height add this value to the specification + row := CurSheet.FindRow(r); + if row <> nil then + rh := Format(' ht="%g" customHeight="1"', [ + (row^.Height + ROW_HEIGHT_CORRECTION)*h0]) + else + rh := ''; AppendToStream(FSSheets[FCurSheetNum], Format( - '', [r+1, LastColIndex+1])); + '', [r+1, LastColIndex+1, rh])); // Write cells belonging to this row. for c := 0 to LastColIndex do begin LCell.Row := r;