【问题标题】:What is the best and fastest way to write into Excel file using C#?使用 C# 写入 Excel 文件的最佳和最快方法是什么?
【发布时间】:2009-05-15 22:24:54
【问题描述】:

我正在尝试使用 OLEDB(没有自动化)写入 excel 文件。 我有大约 500 行数据,这些数据是从其他应用程序获取的,然后使用“INSERT INTO..”查询一一写入 Excel 文件。 我确信从其他应用程序读取数据没有延迟。我检查了那个。 在大约 3 分钟内写入 500 行的 excel 文件所需的总时间。 这太多了。这肯定是文件写操作的原因。

加快速度的最佳方法是什么? 我应该使用其他一些写作技巧吗? 我应该尝试自动化技术吗?

http://support.microsoft.com/kb/306023 此链接显示了许多技术,但不确定使用哪一种。

【问题讨论】:

    标签: c# excel oledb


    【解决方案1】:

    如果你可以COM到excel中,你可以通过COM直接从excel中查询,或者创建一个数据数组并直接将它放入一个等于你数组大小的范围内。尽管 excel 不适合小型 COM 调用,但它适用于少量大型 COM 调用 :)

    DataSet ds = new DataSet();
              da.Fill(ds);
              int width = ds.Tables[0].Columns.Count;
              int height = ds.Tables[0].Rows.Count;
              object[,] retList = new object[height, width];
              for (int i = 0; i < height; i++)
              {
                DataRow r = ds.Tables[0].Rows[i];
                for (int j = 0; j < width; j++)
                  retList[i, j] = r.ItemArray[j];
              }
              Excel.Range range = mWs.get_Range(destination, mWs.Cells[destination.Row + height - 1, destination.Column + width - 1]);
              range.set_Value(Missing.Value, retList);
              System.Runtime.InteropServices.Marshal.ReleaseComObject(range);
              range = null;
    

    这是一个在一次 COM 调用中获取数据并将其作为数组插入到 excel 中的示例

    【讨论】:

    • 您能解释一下代码中的 mW 和目标是什么吗?。
    【解决方案2】:

    Excel 已经提供了在 XML 中读取/写入数据所需的一切。

    我有时会使用SpreadsheetML 格式,它对我很有效。使用它,您可以写出一个 xml 格式的文档,并使用 .xls 扩展名对其进行命名。大多数excel功能都可用。 Microsoft 的参考文档是here。谷歌各种语言的教程,如RailsPHP。这本书Excel Hacks 也谈到了它。

    【讨论】:

      【解决方案3】:

      如果只是数据,则可以导入 CSV 文件。在代码中创建文件并使用自动化使 Excel 导入文件。

      更新:写完这篇我喜欢@MicTech's suggestion,这是我不知道的。

      【讨论】:

      • 我有一个包含许多电子表格的 .xls 文件。我必须在其中一张纸上写字。您能告诉我如何使用自动化导入 csv 文件,然后将数据复制到所需的电子表格中吗?
      • codeproject.com等地方有例子。这应该会有所帮助:msdn.microsoft.com/en-us/library/wss56bz7(VS.80).aspx
      • 这很快,但有时最好在 excel 中使用文本导入来打开 csv,因为 excel 会将某些文本项格式化为科学数字,从而仅给出您拥有的自动 excel 行为的一个示例控制有限。
      【解决方案4】:

      我们使用SpreadsheetGear

      【讨论】:

        【解决方案5】:

        我推荐了FlexCel 库,但它不是免费的:(

        但如果你想要 Office Open XML 格式,你可以使用http://excelpackage.codeplex.com/

        【讨论】:

          【解决方案6】:

          您是要一次性转储到 Excel,还是要保持连接并将数据多次推送到 Excel?

          如果您希望将数据多次推送到 Excel,您应该研究制作 RTD 服务器,我已经多次使用它们并且它们可以工作 RTD Server

          如果您希望一次性推送到 Excel,则需要使用 COM。 Using COM and C#

          C# 版本 4 对托管 COM 进行了一些很好的改进,使用 Excel 时您将不再需要主互操作程序集。 C# 4 尚未投入生产,但如果它适合您,您可以下载它的测试版。

          【讨论】:

            【解决方案7】:

            “写入”到 Excel 的另一种方法是将数据创建为 HTML 页面并加载。 Excel实际上可以读取html。通过 html 执行此操作的一个好处是,您可以比使用 CSV 更好地格式化数据。

            也就是说,如果您只导出简单数据(小文本字段和数字),请使用 CSV。

            【讨论】:

              【解决方案8】:

              嗯,编写 Excel 的最基本(但也是最复杂)的方法是创建一个遵循 BIFF 格式的二进制文件。对于 BIFF 格式,您需要概述 Excel 文件的结构。它非常复杂,但是您可以在每个单元格的基础上控制要写的内容。

              还有其他关于将数据集导出到 Excel 文件的 CodeProject 示例。考虑创建一个遵循 Excel XML 格式的 XML 文件。它还以每个单元格为基础进行写入。看:

              http://www.codeproject.com/KB/office/ExportDataSetToExcel.aspx

              【讨论】:

                【解决方案9】:

                我一直在使用Aspose.Cells 库来编写 Excel 文件并取得了巨大成功。不过它远不便宜。

                【讨论】:

                  【解决方案10】:

                  这个库是免费的,创建 xls 文件的速度非常快,如果你没有安装 MS Office,它也可以工作。 http://code.google.com/p/excellibrary/downloads/list

                  【讨论】:

                    【解决方案11】:

                    我们使用 aspose 单元格。它非常易于使用、速度快、没有明显问题。

                    http://www.aspose.com/categories/.net-components/aspose.cells-for-.net/default.aspx

                    【讨论】:

                      【解决方案12】:

                      快速而肮脏的方法是创建一个包含表格数据的 HTML 表格,然后使用 .xls 扩展名保存它。它可以正常工作,并且可以在 Excel 中正常打开。

                      【讨论】:

                        猜你喜欢
                        • 2020-09-01
                        • 1970-01-01
                        • 2014-03-19
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多