【Delphi编程】delphi-采用内存流将ListView数据导出为Excel文件(未装office可用)

Deiphi编程 专栏收录该内容
4 篇文章 0 订阅
function TTerminalToExport.MyExportExcel(const v_List: TListView; const v_szPath: string; const v_szTitle: string): Boolean;
var
  szFileTemp, szFiled, szFile: string;
  dwRow, dwRowXls: DWORD;
  i, wFieldNums, wFileNums, wCol: WORD;
  FileList: Array[0..20] of String;
  szHander: string;//html头标签
  szEnd: string;//html尾标签
  szTR: string;//tr标签
  szEndTR: string;//tr结束标签
  szVaule: string;
  FileStream: TMemoryStream;
begin
  szFile := v_szPath;
  szFileTemp := ChangeFileExt(v_szPath, '');
  wFileNums := 1;
  FileList[wFileNums - 1] := v_szPath;

  //初始化html头标签
  szHander := '<html xmlns:x="urn:schemas-microsoft-com:office:excel"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets>';
  szHander := szHander+'<x:ExcelWorksheet><x:Name>' + MakeSafeHTMLText(v_szTitle) + '</x:Name><x:WorksheetOptions><x:Print><x:ValidPrinterInfo /></x:Print></x:WorksheetOptions>';
  szHander := szHander+'</x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--><meta http-equiv="Content-Type" content="text/html; charset=gb2312" /><style type="text/css">td {mso-number-format:''\@'';}</style></head><body><div><table><tr>';

  //初始化html尾标签
  szEnd := '</table></div></body></html>';

  //初始化tr标签
  szTR := '<tr>';
  szEndTR := '</tr>';

  wFieldNums := v_List.Columns.Count;

  try
    FileStream := TMemoryStream.Create;
    //写 html头标签
    FileStream.WriteBuffer(Pointer(szHander)^, Length(szHander));

    ///写标题
    szFiled := '<td></td><td align="center" valign="middle" height="50"><strong>' + MakeSafeHTMLText(v_szTitle) + '</strong></td></tr><tr></tr>';
    FileStream.WriteBuffer(Pointer(szFiled)^, Length(szFiled));
    FileStream.WriteBuffer(Pointer(szTR)^,Length(szTR));

    //写字段信息
    for i := 0 to wFieldNums - 1 do
    begin
      if v_List.Columns[i].Width <= 0 then Continue;
      szFiled := '<td>' + MakeSafeHTMLText(v_List.Columns[i].DisplayName) + '</td>';
      FileStream.WriteBuffer(Pointer(szFiled)^, Length(szFiled));
    end;
    FileStream.WriteBuffer(Pointer(szEndTR)^,Length(szEndTR));

    //写内容
    dwRowXls := 3;
    if v_List.Items.Count > 0 then
    begin
      for dwRow := 0 to v_List.Items.Count - 1 do
      begin
        FileStream.WriteBuffer(Pointer(szTR)^,Length(szTR));
        for wCol := 0 to wFieldNums -1 do
        begin
          if v_List.Columns[wCol].Width <= 0 then Continue;

          if wCol = 0 then szVaule := v_List.Items[dwRow].Caption
          else
            szVaule := v_List.Items[dwRow].SubItems.Strings[wCol - 1];

          FileStream.WriteBuffer(Pointer('<td>'+MakeSafeHTMLText(szVaule)+'</td>')^, Length(MakeSafeHTMLText(szVaule)) + 9);
        end;
        FileStream.WriteBuffer(Pointer(szEndTR)^, Length(szEndTR));

        //一个sheet只支持65536行
        if 0 = (dwRowXls mod 65536) then
        begin
          //写后缀
          FileStream.WriteBuffer(Pointer(szEnd)^, Length(szEnd));
          FileStream.SaveToFile(v_szPath); //保存文件
          FileStream.Size:=0;

          //写 html头标签
          FileStream.WriteBuffer(Pointer(szHander)^, Length(szHander));

          szFiled := '<td></td><td align="center" valign="middle"  height="50"><strong>' + MakeSafeHTMLText(v_szTitle) + '</strong></td></tr><tr></tr>';
          FileStream.WriteBuffer(Pointer(szFiled)^, Length(szFiled));
          FileStream.WriteBuffer(Pointer(szTR)^,Length(szTR));

          //写字段信息
          for i := 0 to wFieldNums - 1 do
          begin
            if v_List.Columns[i].Width <= 0 then Continue;
            szFiled := '<td>' + MakeSafeHTMLText(v_List.Columns[i].DisplayName) + '</td>';
            FileStream.WriteBuffer(Pointer(szFiled)^, Length(szFiled));

            dwRowXls:=2;
            Inc(wFileNums);
            szFile := szFileTemp +'(' + intTostr(wFileNums) + ').xls';
            FileList[wFileNums-1] := szFile;
          end;
        end;
        Inc(dwRowXls);
      end;
    end;
    FileStream.WriteBuffer(Pointer(szEnd)^, Length(szEnd));
    FileList[wFileNums-1] := szFile;

    //保存文件
    FileStream.SaveToFile(szFile);
    Application.MessageBox('导出记录到Excel成功!', '提示',  MB_ICONINFORMATION);
    FileStream.Free;
    Result := True;
  except
    Application.MessageBox('导出记录到Excel失败!', '提示',  MB_ICONINFORMATION);
    Result := False;
    FileStream.Free;
  end;
end;

function TTerminalToExport.MakeSafeHTMLText(TheText: widestring): string;
var
  Idx: Integer;
  Ch: wideChar;
begin
  Result := '';
  for Idx := 1 to Length(TheText) do
  begin
    Ch := TheText[Idx];
    case Ch of //html过滤规则
      '<': Result := Result + '&lt;';
      '>': Result := Result + '&gt;';
      '&': Result := Result + '&amp;';
      '"': Result := Result + '&quot;';
      '''':Result := Result +  '&#39;';
      else  
      Result := Result + Ch;
       end;
    end;

end;

function TTerminalToExport.GetExcelSheetName(const v_szTitle: String): String;
const
  byReplace = '_'; //替换特殊字符
var
  szName: string;
begin
  szName := v_szTitle;
  if szName = '' then szName := byReplace  //工作簿名称不能为空
  else
  begin
    //工作簿名称不能包含以下字符 : / ? * [ ]
    szName:=StringReplace(szName, ':', byReplace, [rfReplaceAll]);
    szName:=StringReplace(szName, '∶', byReplace, [rfReplaceAll]);
    szName:=StringReplace(szName, '\', byReplace, [rfReplaceAll]);
    szName:=StringReplace(szName, '\', byReplace, [rfReplaceAll]);
    szName:=StringReplace(szName, '/', byReplace, [rfReplaceAll]);
    szName:=StringReplace(szName, '/', byReplace, [rfReplaceAll]);
    szName:=StringReplace(szName, '?', byReplace, [rfReplaceAll]);
    szName:=StringReplace(szName, '?', byReplace, [rfReplaceAll]);
    szName:=StringReplace(szName, '*', byReplace, [rfReplaceAll]);
    szName:=StringReplace(szName, '*', byReplace, [rfReplaceAll]);
    szName:=StringReplace(szName, '[', byReplace, [rfReplaceAll]);
    szName:=StringReplace(szName, '[', byReplace, [rfReplaceAll]);
    szName:=StringReplace(szName, ']', byReplace, [rfReplaceAll]);
    szName:=StringReplace(szName, ']', byReplace, [rfReplaceAll]);

    if Length(WideString(szName)) > miSheetMaxLen then //工作簿名称长度不能超过31
      szName := Copy(WideString(szName),1,miSheetMaxLen);
  end;
  Result := szName;
end;

 

  • 1
    点赞
  • 5
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

不需Excel也可讀寫xls檔的Delphi控件 用来读取Excel,Access的控件 读写任何单元值 数字型、字符型、布尔型以及错误型。但是你了解日期和时间型单元吗?在Excel中没有这样的单元。Excel是和Delphi一样的方式来存储日期和时间的,即浮点型。那是什么制造了日期或时间值啦,是格式化。 完全支持公式。你可以使用和Excel一样的函数,也支持对外部工作簿引用的公式,你甚至可以从外部引用读取结果。 与操作Delphi的TStringGrid一样的方式操作单元格,或则通过给单元格命名,比如:”D7” 根据单元格的规则以字符串格式读取单元值 根据你的需求格式化单元 格式化很简单。通过获取单元格,你就可以操作单元的格式属性。例如:XLSReadWriteII.Sheet[n].Cell[Col,Row].FontSize := 12; 你也可以对域进行格式化,比如设置边框。 支持所有的Excel格式选项 合并单元格 操作所有的打印选项 选择页面大小,设置边距 设置标题和页脚,包括格式码。 定义打印区域 设置分页符 XLSReadWriteII完全支持Unicode 所有的字符型都是宽字符型。你完全不必担心非英语字符。 控件 你可以插入控件以及定义他们的源和目的单元 绘图 插入所有种类的绘图,从简单的线条到AutoShapes 多行文本和文本框 创建和编辑文本框以及多行文本 图表 创建和Excel中一样选项的图表 复制/移动/删除 可以以Excel一样的行复制、移动和删除单元 行列也可以像单元一样复制和移动 支持工作簿之间的复制和移动 可以复制整个工作簿 使用命名的域/单元 你可以在你想要的任何地方命名 通过命名访问单元格,例如:XLS.NameAsFloat['MyCell'] := 202.5; 支持指定、内置的名称 支持所有超链接类型 网页和E-mail地址 本地文件 服务器文件 工作薄引用 加密文档 你可以读写加密文件。条件是你需要知道文件的密码。 计算 可计算单元以及整个工作薄 计算引擎将依据单元进行计算。 可读取引用的外部工作薄。这通过一个特殊的快速查询程序进行执行 Rich Text单元 了轻松地创建多字体格式的单元,单元可以以RTF格式读写 VBA宏 可以读写文件中的宏,使用XLSReadWriteII可以控件比如:按钮、组合框等添加宏 导入及导出 从下列导入数据… Open Office Calc文档 CSV文件以及其他可以自动识别分隔符、小数分隔符和文本引用字符的文本文件 HTML表格(标签) 数据导出数据… CSV文件 HTML文件 其他 自动过滤 单元验证 有条件的格式 合并单元 PaintCell方法:将单元内容渲染到TCanvas对象的 XLSReadWriteII包还包含下列组件: 从任何数据库中导入数据到工作薄 工作薄导出HTML文件
相关推荐
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值