Столкнулся с задачкой, переброски данных из приложения в эксель. Взял пример из DRKB, все получилось, только вот проблемка с шириной ячеек, как в экселе сделать форматирование ячеек? И еще приложил скрин формы приложения. там внизу у меня есть пустая строка, туда хотел дописать Итого и сумму по всем значений в 4 столбце, но вот никак не пойму как сделать в гриде у значения типа стриг, и как их просуммировать, в типе реал вроде не понимает точку, вместо запятой. Давно мучает вопрос, как прописать, что бы в поле Edit можно было вводить только 4 цифры и только цифры, а так же сделать проверку на его заполнение, на ссылку типа Null вроде не реагирует.
col := DM_1.CDS1.RecordCount; if col = 0 then begin ShowMessage('Данные отсуствуют '); end; if col <> 0 then begin ShowMessage('Загруженно ' + IntToStr(col) + ' записей'); Print_Otch_Express.StringGrid1.RowCount := col + 3; end;
while not DM_1.CDS1.eof do begin
for i := 3 to Print_Otch_Express.StringGrid1.RowCount - 1 do begin
function RefToCell(RowID, ColID: Integer): string; var ACount, APos: Integer;
begin ACount := ColID div 26; APos := ColID mod 26; if APos = 0 then
begin ACount := ACount - 1; APos := 26; end;
if ACount = 0 then Result := Chr(Ord('A') + ColID - 1) + IntToStr(RowID); if ACount = 1 then Result := 'A' + Chr(Ord('A') + APos - 1) + IntToStr(RowID); if ACount > 1 then Result := Chr(Ord('A') + ACount - 1) + Chr(Ord('A') + APos - 1) + IntToStr(RowID); end;
// Export StringGrid contents to Excel
function StringGridToExcelSheet(Grid: TStringGrid; SheetName, FileName: string; ShowExcel: Boolean): Boolean; const xlWBATWorksheet = -4167; var SheetCount, SheetColCount, SheetRowCount, BookCount: Integer; XLApp, Sheet, Data: OLEVariant; I, J, N, M: Integer; SaveFileName: string;
begin
//notwendige Sheetanzahl feststellen SheetCount := (Grid.ColCount div 256) + 1; if Grid.ColCount mod 256 = 0 then SheetCount := SheetCount - 1; //notwendige Bookanzahl feststellen BookCount := (Grid.RowCount div 65536) + 1; if Grid.RowCount mod 65536 = 0 then
BookCount := BookCount - 1;
//Create Excel-OLE Object Result := False; XLApp := CreateOleObject('Excel.Application'); try //Excelsheet anzeigen if ShowExcel = False then XLApp.Visible := False else XLApp.Visible := True; //Workbook hinzufugen for M := 1 to BookCount do begin XLApp.Workbooks.Add(xlWBATWorksheet); //Sheets anlegen for N := 1 to SheetCount - 1 do begin XLApp.Worksheets.Add; end; end; //Sheet ColAnzahl feststellen if Grid.ColCount <= 256 then SheetColCount := Grid.ColCount else SheetColCount := 256; //Sheet RowAnzahl feststellen if Grid.RowCount <= 65536 then SheetRowCount := Grid.RowCount else SheetRowCount := 65536; //Sheets befullen for M := 1 to BookCount do begin for N := 1 to SheetCount do begin //Daten aus Grid holen Data := VarArrayCreate([1, Grid.RowCount, 1, SheetColCount], varVariant); for I := 0 to SheetColCount - 1 do for J := 0 to SheetRowCount - 1 do if ((I + 256 * (N - 1)) <= Grid.ColCount) and ((J + 65536 * (M - 1)) <= Grid.RowCount) then Data[J + 1, I + 1] := Grid.Cells[I + 256 * (N - 1), J + 65536 * (M - 1)]; //------------------------- XLApp.Worksheets[N].Select; XLApp.Workbooks[M].Worksheets[N].Name := SheetName + IntToStr(N); //Zellen als String Formatieren XLApp.Workbooks[M].Worksheets[N].Range[RefToCell(1, 1), RefToCell(SheetRowCount, SheetColCount)].Select; XLApp.Selection.NumberFormat := '@'; XLApp.Workbooks[M].Worksheets[N].Range['A1'].Select; //Daten dem Excelsheet ubergeben Sheet := XLApp.Workbooks[M].WorkSheets[N]; Sheet.Range[RefToCell(1, 1), RefToCell(SheetRowCount, SheetColCount)].Value := Data; end; end; //Save Excel Worksheet try for M := 1 to BookCount do begin SaveFileName := Copy(FileName, 1, Pos('.', FileName) - 1) + IntToStr(M) + Copy(FileName, Pos('.', FileName), Length(FileName) - Pos('.', FileName) + 1); XLApp.Workbooks[M].SaveAs(SaveFileName); end; Result := True; except // Вот оно херачит end; finally //Excel Beenden if (not VarIsEmpty(XLApp)) and (ShowExcel = False) then
procedure TPrint_Otch_Express.Button3Click(Sender: TObject); begin Close; end;
procedure TPrint_Otch_Express.ComboBox1Change(Sender: TObject); var MonthSelected: Integer; begin MonthSelected := Print_Otch_Express.ComboBox1.ItemIndex + 1; end;
procedure TPrint_Otch_Express.FormCreate(Sender: TObject); begin // Print_Otch_Express.StringGrid1.Cells[0, 0] := ' Код Платежа'; //Print_Otch_Express.StringGrid1.Cells[1, 0] := ' Номер Статьи'; Print_Otch_Express.StringGrid1.Cells[2, 0] := 'Отчет разных сборов и прочих '+ 'поступлений по пассажирским перевозкам по КБШ ж.д.';
Print_Otch_Express.StringGrid1.Cells[0, 2] := ' Код Платежа'; Print_Otch_Express.StringGrid1.Cells[1, 2] := ' Номер Статьи'; Print_Otch_Express.StringGrid1.Cells[2, 2] := ' ' + ' Наименование платежа'; Print_Otch_Express.StringGrid1.Cells[3, 2] := ' Сумма';
end;
end.
Эскизы прикрепленных изображений
--------------------
Отрадно спать, отрадней камнем быть, О, этот век, преступный и постыдный, Не жить, не чувствовать - удел завидный. Прошу, молчи, не смей меня будить!