Создавайте, редактируйте, проверяйте, вычисляйте и экспортируйте книги Excel напрямую из кода Delphi или C++Builder. HotXLS — нативная библиотека Object Pascal с исходным кодом для рабочих процессов XLS и XLSX, предназначенная для настольных инструментов, batch-задач, систем отчетности и серверной генерации документов без автоматизации Microsoft Excel.
Эта статья предназначена для developers generating visual Excel reports, dashboards, or template-based workbooks in Delphi. Она рассматривает charts, images, and drawing objects как промышленную инженерию документов, а не как одиночный вызов компонента.
Практический риск состоит в том, что visual workbook elements fail when anchors, sheet changes, chart ranges, image DPI, and drawing identifiers are treated as decorative afterthoughts. Поэтому процессу нужны письменный контракт, наблюдаемая диагностика и реалистичные регрессионные файлы.
Архитектурные решения
Treat drawings as workbook data. chart data range ownership and whether ranges expand with inserted rows / image source, DPI, compression, transparency, and alternate text policy
- chart data range ownership and whether ranges expand with inserted rows
- image source, DPI, compression, transparency, and alternate text policy
- object anchoring behavior when cells resize, hide, or move
- whether existing drawings are preserved, replaced, or regenerated from templates
Порядок реализации
Bind visuals to stable ranges and anchors. The order below keeps the workflow reviewable for Delphi and C++Builder teams.
- prepare named ranges or stable addresses before creating chart objects
- normalize image dimensions and compression before insertion
- place drawings with the intended cell anchor and movement behavior
- recalculate or refresh chart ranges after data changes
- open the workbook in the target Excel version and inspect layout at print scale
Доказательства проверки
Visual-output evidence for workbook support. Keep these fields with the output or support record.
- chart type, source range, sheet name, and series count
- image dimensions, DPI, compression mode, anchor cell, and object identifier
- drawing preservation or regeneration decision for each template object
- viewer compatibility notes for Excel, LibreOffice, or downstream conversion
A chart depends on workbook structure
Charts, pictures, and shapes are connected to sheets, cell anchors, relationships, and sometimes formulas. A reliable workflow keeps those relationships stable when rows, columns, templates, or sheet order change.
Заметки по промышленной реализации
Рассматривайте HotXLS: charts, images, and drawing objects in Delphi как явный сервисный контракт вокруг вызовов HotXLS, разделяя проверку входных данных, запись книги, контроль результата и сведения для поддержки
- Определите источник данных, диапазоны ячеек и формат вывода до создания книги
- Записывайте число строк, листы, предупреждения и путь вывода в проверяемые сведения поддержки
- Инкапсулируйте прикладные детали в тестируемые helper-функции, а не в события UI
- Повторно откройте или проверьте сохраненный файл перед передачей другой системе или клиенту
Сценарии отказов для проверки
- Успешный SaveAs не доказывает, что бизнес-контракт остался корректным
- Шрифты, права и региональные настройки на сервере могут отличаться от машины разработчика
- Журналы не должны раскрывать пароли, данные клиентов или внутренние ссылки
Подробный пример Delphi
Следующий пример Delphi показывает практическую границу сервиса для этой темы, где политика, журналирование и проверка остаются тестируемыми
procedure BuildSalesDashboardWorkbook(const OutputFile, LogoFile: string; const Rows: TArray<TSalesRow>);
var
Wb: TXLSXWorkbook;
Sh: IXLSWorksheet;
RowIndex: Integer;
Row: TSalesRow;
begin
Wb := TXLSXWorkbook.Create;
try
Sh := Wb.Sheets[0];
Sh.Name := 'Dashboard';
Sh.Range['A1'].Value := 'Quarter';
Sh.Range['B1'].Value := 'Revenue';
Sh.Range['C1'].Value := 'Margin';
Sh.Range['D1'].Value := 'Pipeline';
RowIndex := 2;
for Row in Rows do
begin
Sh.Range['A' + IntToStr(RowIndex)].Value := Row.Quarter;
Sh.Range['B' + IntToStr(RowIndex)].Value := Row.Revenue;
Sh.Range['C' + IntToStr(RowIndex)].Value := Row.Margin;
Sh.Range['D' + IntToStr(RowIndex)].Value := Row.Pipeline;
Inc(RowIndex);
end;
Sh.Range['A1:D1'].ApplyBuiltinStyle(xbsTitle);
Sh.Range['A2:D' + IntToStr(RowIndex - 1)].ApplyBuiltinStyle(xbsGood);
AddColumnChart(Sh, 'A1:D' + IntToStr(RowIndex - 1), 'F3:M18');
AddImageIfPresent(Sh, LogoFile, 'F1');
WriteWorkbookAudit(Wb, 'dashboard', RowIndex - 2);
if Wb.SaveAs(OutputFile) <> 1 then
RaiseWorkbookSaveError(OutputFile);
finally
Wb.Free;
end;
end;
Производственный чек-лист
- Run the workflow on an empty workbook, a normal customer workbook, and a worst-case workbook
- Open the output with the target spreadsheet application or downstream importer
- Log product version, template version, profile, row count, output path, elapsed time, and warning count
- Keep passwords, temporary files, customer data, and support bundles under explicit retention rules
- Add regression workbooks when a customer file exposes a new edge case