簡體   English   中英

使用C#創建Excel表的最簡單方法是什么?

[英]What's the easiest way to create an Excel table with C#?

我有一些表格數據,我想把它變成Excel表格。

可用軟件:

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

有關數據的信息:

  • 幾百萬行
  • 5列,所有字符串(非常簡單和常規的表結構)
  • 在我的腳本中,我目前正在使用嵌套的List數據結構,但我可以更改它
  • 腳本的性能並不重要

在線搜索給出了很多結果,我很困惑我是否應該使用OleDb,ADO RecordSets或其他東西。 其中一些技術對於我的場景來說似乎有些過分,有些看起來可能已經過時了。

最簡單的方法是什么?

編輯 :這是我打算從我參加的桌面運行的一次性腳本。

避免不惜一切代價使用COM互操作。 使用第三方API。 真。 事實上,如果你正在做這個服務器端,你幾乎必須這樣做。 有很多免費選擇。 我強烈建議使用EPPlus,但也有企業級解決方案。 我已經使用了相當數量的EPPlus,效果很好。 與interop不同,它允許您生成Excel文件而無需在計算機上安裝Excel,這意味着您也不必擔心COM對象作為后台進程而存在。 即使使用適當的對象處理,Excel進程也不會總是結束。

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

我知道你說你想避開第三方圖書館,但他們真的是要走的路。 Microsoft不建議自動化Office。 無論如何,這並不意味着自動化。

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

但是,您可能需要重新考慮將“幾百萬行”插入到單個電子表格中。

尊重您的請求,以避免第三方工具和使用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(); } 

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

如果這是客戶端解決方案,使用Interops沒有任何問題。 如果這是服務器端解決方案,請不要使用Interops。 如果您不想要第三方解決方案,那么很好的替代方案是Microsoft的OpenXML SDK。 免費。 我相信最新版本的Excel具有類似的對象模型。 在生成工作簿和執行可能會使服務器陷入困境的interop方式方面要快得多。

我曾經讀過,創建Excel表的最簡單方法是實際編寫HTML表,包括其結構和數據,並簡單地命名文件.xls

Excel將能夠轉換它,但它會顯示一條警告,說明內容與擴展名不匹配。

我同意第三方dll比com更干凈,但如果你去互操作路線......

放下填充Excel工作表的最佳方法是首先將數據放入二維字符串數組中,然后獲取具有相同尺寸的excel范圍對象並設置它(我認為是range.set_value2(oarray))。 使用任何其他方法都非常慢。

還要確保在finally塊中使用適當的清理代碼。

我使用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"
            );
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM