excel - 使用 Delphi 和 OLE 将多个 html 文件加载到一个 Excel 工作簿的单独工作表中
问题描述
我有 3 个 html 文件 test1、test2 和 test3。我想将这 3 个文件加载到一个 Excel 工作簿中,并将每个 HTML 文件加载到单独的工作表 test1、test2 和 test3 上。我想使用 Delphi 和 OLE 自动化。在 VB 中可能更多,但我找不到 Delphi 代码
谢谢
解决方案
正如我在评论中提到的,如果您尝试将 .Html 文件加载到 WorkBook 中,Excel 将从 WorkBook 中删除现有的 WorkSheets,然后将 .Html 加载到新的单个工作表中,因此如果您尝试打开多个.Html 文件在同一个工作簿中,您最终只会加载最后一个。并非所有 .Html 文件似乎都能被 Excel 消化,顺便说一句,它经常抱怨诸如无法访问必要的 .Css 文件之类的事情。
因此,下面的代码通过将 .Html 文件加载到单独的工作簿中来完成我认为您想要的操作,然后将第二个到第 N 个 .Html 文件的单个工作表复制到第一个工作表中,并将其保存在 C:\Temp 中。希望代码应该是合理的不言自明的,但如果有疑问,请询问。我只展示了处理第一个和第二个 .Html 文件,因为您只需为第三个到第 N 个重复第二个的步骤。
uses
Variants, ComObj;
procedure TForm1.btnLoadClick(Sender: TObject);
var
vExcel,
vWorkbook1,
vWorkBook2,
vWorkSheet,
vWorkSheet2,
vSourceRange,
vDestRange : OleVariant;
const
xlOpenXMLWorkbook = $00000033; // borrowed from Excel 2010 type lib import
begin
vExcel := CreateOleObject('Excel.Application');
vExcel.Visible := True;
vExcel.DisplayAlerts := False;
try
// The following starts a new workbook and loads the first .Html file
vWorkBook1 := vExcel.WorkBooks.Open('d:\aaad7\html\Inputs.html');
// Next, save it in C:\Temp in XLSX format
vWorkBook1.SaveAs(FileName := 'C:\temp\' + 'Output.Xlsx', FileFormat:= xlOpenXMLWorkbook);
// Next, open another wokkbook with the 2nd .Html file
vWorkBook2 := vExcel.WorkBooks.Open('d:\aaad7\html\Test.Html');
// The next bit uses Excel Range objects to make a copy of the worksheet from the 2nd
// workbook into a new worksheet in
vSourceRange := vWorkBook2.WorkSheets[1].UsedRange;
vWorkSheet := vWorkBook1.WorkSheets.Add;
vDestRange := vWorkSheet.Range['A1', 'A1'];
vSourceRange.Copy(vDestRange);
vWorkBook2.Close;
vWorkBook1.SaveAs(FileName := 'C:\temp\' + 'Output.Xlsx', FileFormat:= xlOpenXMLWorkbook);
// for the 3rd to Nth .Html files, repeat the steps starting with
// vWorkBook2 := vExcel.WorkBooks.Open([...])
finally
vWorkBook1 := UnAssigned;
vWorkBook2 := UnAssigned;
vExcel := UnAssigned;
end;
end;
推荐阅读
- c++ - 数组的存储大小未知
- c - 变量声明和定义不匹配
- python - MATLAB binofit 的 Python 等效项
- java - 安全客户端/服务器认证协议
- android - 如何将 google 签名与 android 的电子邮件和密码身份验证联系起来
- java - 将适配器设置为回收器视图时出现空指针异常
- c# - 如何选择特定的子节点并在其中添加新的子节点
- c# - 400 Bad Request 通过 HttpClient.PutAsync 向 WebApi 提交 Json
- javascript - 无法从服务器端获取数组
- javascript - 所以这个脚本每小时进行超过 3000 次 API 调用,我不知道为什么。我该如何解决这个问题?