使用C#创建Excel表的最简单方法是什么?

时间:2011-01-22 04:39:40

标签: c# excel

我有一些表格数据,我想把它变成Excel表格。

可用软件:

  • .NET 4(C#)
  • Excel 2010(使用Excel API即可)
  • 我不想使用任何第三方库

有关数据的信息:

  • 几百万行
  • 5列,所有字符串(非常简单和常规的表结构)
  • 在我的脚本中,我目前正在使用嵌套的List数据结构,但我可以更改
  • 脚本的性能并不重要

在线搜索会产生很多结果,我很困惑我是否应该使用OleDb,ADO RecordSets或其他东西。其中一些技术对于我的场景来说似乎有点过头了,有些看起来可能已经过时了。

最简单的方法是什么?

编辑:这是我打算从我参加的桌面运行的一次性脚本。

6 个答案:

答案 0 :(得分:8)

避免不惜一切代价使用COM互操作。使用第三方API。真。事实上,如果你正在做这个服务器端,你几乎必须这样做。有很多免费选择。我强烈建议使用EPPlus,但也有企业级解决方案。我已经使用了相当数量的EPPlus,效果很好。与interop不同,它允许您生成Excel文件而无需在计算机上安装Excel,这意味着您也不必担心COM对象作为后台进程而存在。即使使用适当的对象处理,Excel进程也不会总是结束。

http://epplus.codeplex.com/releases/view/42439

我知道你说你想避开第三方图书馆,但他们真的是要走的路。 Microsoft不建议自动化Office。无论如何,这并不意味着自动化。

http://support.microsoft.com/kb/257757

但是,您可能需要重新考虑在一个电子表格中插入“几百万行”。

答案 1 :(得分:5)

尊重您的请求,以避免使用第三方工具和使用COM对象,以下是我的方法。

  1. 添加对项目的引用:Com对象 Microsoft Excel 11.0。
  2. 模块顶部添加:

    using Microsoft.Office.Interop.Excel;
    
  3. 添加如下事件逻辑:

    private void DoThatExcelThing()
    {
    
        ApplicationClass myExcel;
        try
        {
            myExcel = GetObject(,"Excel.Application")
        }
        catch (Exception ex)
        {
            myExcel = New ApplicationClass()
        }
    
        myExcel.Visible = true;
        Workbook wb1 = myExcel.Workbooks.Add("");
        Worksheet ws1 = (Worksheet)wb1.Worksheets[1];
    
        //Read the connection string from App.Config
        string strConn = System.Configuration.ConfigurationManager.ConnectionStrings["NewConnString"].ConnectionString;
    
        //Open a connection to the database
        SqlConnection myConn = new SqlConnection();
        myConn.ConnectionString = strConn;
        myConn.Open();
    
        //Establish the query
        SqlCommand myCmd = new SqlCommand("select * from employees", myConn);
        SqlDataReader myRdr = myCmd.ExecuteReader();
    
        //Read the data and put into the spreadsheet.
        int j = 3;
        while (myRdr.Read())
        {
            for (int i=0 ; i < myRdr.FieldCount; i++)
            {
                ws1.Cells[j, i+1] = myRdr[i].ToString();
            }
            j++;
        }
    
        //Populate the column names
        for (int i = 0; i < myRdr.FieldCount ; i++)
        {
            ws1.Cells[2, i+1] = myRdr.GetName(i);
        }
        myRdr.Close();
        myConn.Close();
    
        //Add some formatting
        Range rng1 = ws1.get_Range("A1", "H1");
        rng1.Font.Bold = true;
        rng1.Font.ColorIndex = 3;
        rng1.HorizontalAlignment = XlHAlign.xlHAlignCenter;
    
        Range rng2 = ws1.get_Range("A2", "H50");
        rng2.WrapText = false;
        rng2.EntireColumn.AutoFit();
    
        //Add a header row
        ws1.get_Range("A1", "H1").EntireRow.Insert(XlInsertShiftDirection.xlShiftDown, Missing.Value);
        ws1.Cells[1, 1] = "Employee Contact List";
        Range rng3 = ws1.get_Range("A1", "H1");
        rng3.Merge(Missing.Value);
        rng3.Font.Size = 16;
        rng3.Font.ColorIndex = 3;
        rng3.Font.Underline = true;
        rng3.Font.Bold = true;
        rng3.VerticalAlignment = XlVAlign.xlVAlignCenter;
    
        //Save and close
        string strFileName = String.Format("Employees{0}.xlsx", DateTime.Now.ToString("HHmmss"));
        System.IO.File.Delete(strFileName);
        wb1.SaveAs(strFileName, XlFileFormat.xlWorkbookDefault, Missing.Value, Missing.Value, Missing.Value, Missing.Value,
            XlSaveAsAccessMode.xlExclusive, Missing.Value, false, Missing.Value, Missing.Value, Missing.Value);
        myExcel.Quit();
    
    }
    

答案 2 :(得分:3)

我曾经读过,创建Excel表的最简单方法是实际编写HTML表格,包括其结构和数据,并简单地命名文件.xls

Excel可以转换它,但它会显示一条警告,说明内容与扩展名不匹配。

答案 3 :(得分:2)

有些事情需要考虑......

如果这是客户端解决方案,使用Interops没有任何问题。 如果这是服务器端解决方案,请不要使用Interops。如果您不想要第三方解决方案,那么很好的替代方案是Microsoft的OpenXML SDK。免费。我相信最新版本的Excel具有类似的对象模型。生成工作簿与使用可能会使服务器陷入困境的互操作方式的速度要快得多。

答案 4 :(得分:1)

我同意第三方dll会比com更干净,但是如果你采用互操作路线......

确定填充Excel工作表的最佳方法是首先将数据放入二维字符串数组中,然后获取具有相同尺寸的excel范围对象并设置它(我认为是range.set_value2(oarray))。使用任何其他方法都非常慢。

还要确保在finally块中使用适当的清理代码。

答案 5 :(得分:1)

我使用ms-access-ole-db-driver实现了“export to Excel”,它也可以通过以下方式读写excel文件:

准备(做一次)

  • 创建一个包含所有(标题,格式,公式,图表)的Excel文件,其中空数据区域作为要填充的模板
  • 为数据区域(包括标题)指定名称(即“MyData”)

实施出口

  • 将模板文件复制到目标文件夹
  • 打开与目标文件的oledb-database连接
  • 使用sql插入数据

实施例

Excel table with Named area "MyData"
Name, FamilyName, Birthday

open System.Data.OleDb.OleDbConnection
execute sql "Insert into MyData(Name, FamilyName, Birthday) values(...)"

我使用了这个连接字符串

private const string FORMAT_EXCEL_CONNECT =
        // @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=""Excel 8.0;HDR={1}""";
        @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=""Excel 12.0;HDR={1}""";


    private static string GetExcelConnectionString(string excelFilePath, bool header)
    {
        return string.Format(FORMAT_EXCEL_CONNECT,
            excelFilePath,
            (header) ? "Yes" : "No"
            );
    }