【问题标题】:Export TStringGrid to doc, xls and pdf将 TStringGrid 导出为 doc、xls 和 pdf
【发布时间】:2012-06-18 09:03:41
【问题描述】:

我有一种在 TZColorStringGrid 的帮助下创建的报告(它是 Delphi 的 TStringGrid 的后代),我希望能够导出为 doc、xls、pdf 并能够打印本报告。所以我在过去两天一直在思考如何做到这一点。

我在这里找到了一篇帖子,有人询问如何从 TStringGrid How to create a QuickReport from the contents of a TStringGrid 的内容创建 TClientDataSet,提供的答案是使用 QuickReport.OnNeedData 事件处理程序。当我读到我很高兴时,我对自己说就是这样,但是在我意识到我的 DelphiXe2 上没有快速报告之后,所以这个解决方案失败了。 我可以使用 Fast Reports 以类似的方式做到这一点吗?

我想到解决问题的第二种方法是使用 JVCL 导出组件,但导出仅适用于 DBGrid,不适用于 TStringGrid。所以我认为我还需要从我的 TStringGrid 创建 TClientDataSet 并将 TClientDataSet 链接到 DbGrid 并导出它。 但我不知道如何创建该 ClientDataSet 以及是否会保留我的 TStringGrid 结构,如下图所示

稍后编辑:TJvPrint 是 JVCL 的组件,用于打印字符串网格,它不需要 TClientDataSet 即可工作,但它不保留我的表结构(我的意思是合并的单元格、字体格式等)

我认为可以解决我的问题的第三种方法是找到一个免费的组件来导出我的 TStringGrid。我找到了一个 SMExport,但它不是免费的,而且我根本没有钱投资它(不幸的是我还是个学生)。 您知道任何其他可用于导出 TStringGrid 的免费组件吗?

如果有人想到导出 TStringGrid 的另一种解决方案并且如果他想分享它,我将不胜感激!

【问题讨论】:

  • 你从哪里得到数据?您可以使用数据集后代组件来获取数据,不是吗?然后你可以使用 fastreport 来设计布局。 (torry.net/pages.php?s=73) 上有免费的组件“PrintGrid”来打印 stringgrid,但您可能需要修改它才能在 xe2 上运行。我不知道,以前从未使用过它。至于导出到excel、word、pdf,通常是商业产品自带的。另一种方法是将 ole 自动化与 excel 一起使用并用您的数据填充工作表。 (codeprogrammer.blogspot.com/2007/02/…)
  • 嗨亨德拉。我有几个查询来获取 stringgrid 中的数据:我正在做的是一个学校调度程序应用程序,所以我需要它们的结构像图像中一样,我选择了 tstringgrid,因为我试图将单元格与 Reporting Services 合并但失败了;同样在快速报告中,我无法构建矩阵报告,因为我相信我的 FastReport 安装中缺少此功能。我尝试使用 Ole 自动化,但我找到了一些关于如何做到这一点的例子,这些例子已经有几年了,但它在 xe2 中不起作用:这个例子 swissdelphicenter.ch/torry/showcode.php?id=379
  • ole 怎么不起作用?你有错误信息吗?
  • // Add new Workbook XLApp.Workbooks.Add(xlWBatWorkSheet); Sheet := XLApp.Workbooks[1].WorkSheets[1]; -- 这里出现了第一个错误“Undeclared Identifier WorkSheets”,我已经添加了 ComObj 来使用子句
  • @Cristian,不,上面 torry 的代码只是用来自 stringgrid 的数据填充 excel 工作表。使用 ole,您可以存储值并调整单元格格式(字体、数字格式、宽度、边框),但这些必须以编程方式完成。例如,参见 (swissdelphicenter.ch/torry/showcode.php?id=156)。

标签: delphi delphi-xe2 tclientdataset tstringgrid jvcl


【解决方案1】:
procedure TForm1.exportClick(Sender: TObject);
var
  i: Integer;
  CSV: TStrings;
  SD: TSaveDialog;
  FileName: string;
begin
  SD := TSaveDialog.Create(nil);
  try
    SD.Filter := 'CSV (*.csv)|*.CSV';
    // filters file types to only allow you to select CSV files

    if SD.Execute then
    begin
      FileName := SD.FileName;
      if ExtractFileExt(FileName) <> '.csv' then
        FileName := FileName + '.csv';

      Screen.Cursor := crHourGlass;
      try
        CSV := TStringList.create;
        try
          for i := 0 to StringGrid1.RowCount - 1 do
            CSV.Add(StringGrid1.Rows[i].CommaText);

          CSV.SaveToFile(FileName);
        finally
          CSV.free;
        end;
      finally
        Screen.Cursor := crDefault;
      end;
    end;

  finally
    SD.Free;        
  end;
end;

试试吧,我不确定它是否会保留合并的单元格

【讨论】:

    猜你喜欢
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    • 2011-07-29
    • 1970-01-01
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    • 2015-08-26
    相关资源
    最近更新 更多