Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Создаём Excel файл без OLE

Delphi , Файловая система , Файлы

Создаём Excel файл без OLE


const 
  CXlsBof: array[0..5] of Word = ($809, 8, 00, $10, 0, 0); 
  CXlsEof: array[0..1] of Word = ($0A, 00); 
  CXlsLabel: array[0..5] of Word = ($204, 0, 0, 0, 0, 0); 
  CXlsNumber: array[0..4] of Word = ($203, 14, 0, 0, 0); 
  CXlsRk: array[0..4] of Word = ($27E, 10, 0, 0, 0); 

procedure XlsBeginStream(XlsStream: TStream; const BuildNumber: Word); 
begin 
  CXlsBof[4] := BuildNumber; 
  XlsStream.WriteBuffer(CXlsBof, SizeOf(CXlsBof)); 
end; 

procedure XlsEndStream(XlsStream: TStream); 
begin 
  XlsStream.WriteBuffer(CXlsEof, SizeOf(CXlsEof)); 
end; 

procedure XlsWriteCellRk(XlsStream: TStream; const ACol, ARow: Word; 
  const AValue: Integer); 
var 
  V: Integer; 
begin 
  CXlsRk[2] := ARow; 
  CXlsRk[3] := ACol; 
  XlsStream.WriteBuffer(CXlsRk, SizeOf(CXlsRk)); 
  V := (AValue shl 2) or 2; 
  XlsStream.WriteBuffer(V, 4); 
end; 

procedure XlsWriteCellNumber(XlsStream: TStream; const ACol, ARow: Word; 
  const AValue: Double); 
begin 
  CXlsNumber[2] := ARow; 
  CXlsNumber[3] := ACol; 
  XlsStream.WriteBuffer(CXlsNumber, SizeOf(CXlsNumber)); 
  XlsStream.WriteBuffer(AValue, 8); 
end; 

procedure XlsWriteCellLabel(XlsStream: TStream; const ACol, ARow: Word; 
  const AValue: string); 
var 
  L: Word; 
begin 
  L := Length(AValue); 
  CXlsLabel[1] := 8 + L; 
  CXlsLabel[2] := ARow; 
  CXlsLabel[3] := ACol; 
  CXlsLabel[5] := L; 
  XlsStream.WriteBuffer(CXlsLabel, SizeOf(CXlsLabel)); 
  XlsStream.WriteBuffer(Pointer(AValue)^, L); 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
  FStream: TFileStream; 
  I, J: Integer; 
begin 
  FStream := TFileStream.Create('c:\e.xls', fmCreate); 
  try 
    XlsBeginStream(FStream, 0); 
    for I := 0 to 99 do 
      for J := 0 to 99 do 
      begin 
        XlsWriteCellNumber(FStream, I, J, 34.34); 
        // XlsWriteCellRk(FStream, I, J, 3434); 
        // XlsWriteCellLabel(FStream, I, J, Format('Cell: %d,%d', [I, J])); 
      end; 
    XlsEndStream(FStream); 
  finally 
    FStream.Free; 
  end; 
end;

Программа на Delphi, которая создает файл Excel без использования OLE (Object Linking and Embedding). Программа использует компонент TFileStream, чтобы записать данные в файл с именем "c:\e.xls".

Программа определяет несколько констант (CXlsBof, CXlsEof и т.д.), которые представляют собой заголовок и подвал Excel-файла. Она также определяет три процедуры: XlsBeginStream, XlsEndStream и три других процедуры, которые пишут данные в поток.

В обработчике события Button1Click программа создает новый файл, используя TFileStream.Create, а затем начинает запись потока, используя XlsBeginStream. Затем программа проходит по 100 строкам и столбцам, записывая число ячейки (34.34) в каждом положении, используя XlsWriteCellNumber.

Альтернативное решение:

Вместо определения отдельных процедур для записи ячеек с различными типами данных можно создать одиночную процедуру, которая принимает указатель на данные и длину параметров. Это позволит записывать ячейки с любым типом данных.

Обновленная версия программы:

procedure XlsWriteCell(XlsStream: TStream; const ACol, ARow: Word; pData: Pointer; pDataLen: Integer);
begin
  CXlsNumber[2] := ARow;
  CXlsNumber[3] := ACol;
  XlsStream.WriteBuffer(CXlsNumber, SizeOf(CXlsNumber));
  if pDataLen > 0 then
    XlsStream.WriteBuffer(pData^, pDataLen);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  FStream: TFileStream;
  I, J: Integer;
begin
  FStream := TFileStream.Create('c:\e.xls', fmCreate);
  try
    XlsBeginStream(FStream, 0);
    for I := 0 to 99 do
      for J := 0 to 99 do
      begin
        XlsWriteCell(FStream, I, J, @IntToDouble(34.34), SizeOf(Double));
      end;
    XlsEndStream(FStream);
  finally
    FStream.Free;
  end;
end;

function IntToDouble(val: Integer): Double;
begin
  Result := val + 0.0; // конвертируем целочисленное значение в вещественное
end;

В этой версии программа создает одиночную процедуру XlsWriteCell, которая принимает указатель на данные и длину параметров, и пишет данные в поток. Функция IntToDouble используется для конвертации целочисленного значения в вещественное.

Эта APPROACH позволяет записывать ячейки с любым типом данных, включая строки, целые числа и дробные числа. Вы можете модифицировать процедуру XlsWriteCell, чтобы обрабатывать различные типы данных, используя функцию TypeOf для определения типа данных, а затем записывая его соответствующим образом.

Создание Excel-файла без использования технологии OLE.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Файлы ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-10-24 19:56:21/0.0036067962646484/0