簡體   English   中英

將datatable轉換為excel 2007(.xlsx)

[英]Convert datatable to excel 2007(.xlsx)

我有一個DataTable我需要放入Excel 2007格式並將其保存為excel文件(.xlsx)2007。

任何人都可以幫我實現這個目標嗎?

您可以使用OLEDB數據提供程序,只需將Excel視為另一個ADO.NET數據源,以便遍歷DataTable行並將它們插入Excel電子表格中。 這是一篇Microsoft知識庫文章,向您介紹了很多細節。

http://support.microsoft.com/kb/316934/en-us

要記住的重要一點是,您可以在工作簿中創建工作簿和工作表,並且可以通過在名稱末尾附加“$”來引用現有工作表。 如果省略工作表名稱末尾的“$”,OLEDB提供程序將假定它是一個新工作表並將嘗試創建它。

工作表名稱后面的美元符號表示該表存在。 如果要創建新表,如本文的“創建新工作簿和表”部分中所述,請不要使用美元符號。

您可以在2003(.xls)或2007格式(xlsx)中創建和開發電子表格,並在連接字符串上定義 - 指定要寫入的文件,並指定擴展名。 確保使用正確的OLEDB提供程序版本。

如果要創建2003(.xls)版本,請使用此連接字符串:

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Book1.xls;Extended Properties="Excel 8.0;HDR=YES

如果要創建2007(.xlsx)版本,請使用此連接字符串:

Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Book1.xlsx;Extended Properties="Excel 12.0;HDR=YES

您可能必須從Microsoft下載ACE提供程序才能創建XLSX文件。 你可以在這里找到它。

我通常使用XLS提供程序,所以我沒有同樣使用XLSX提供程序。

希望這可以幫助。 如果您有其他問題,請告訴我。

我在一段時間后為公司編寫了以下代碼。 它需要任何類類型的Enumerable並將其所有(get)屬性導出到Excel並打開Excel。 您應該可以為DataTable執行類似的操作。 請記住,您需要添加對Microsoft.Office.Interop.Excel的引用

    public static void ExportToExcel<T>(IEnumerable<T> exportData)
    {
        Excel.ApplicationClass excel = new Excel.ApplicationClass();
        Excel.Workbook workbook = excel.Application.Workbooks.Add(true);
        PropertyInfo[] pInfos = typeof(T).GetProperties();
        if (pInfos != null && pInfos.Count() > 0)
        {
            int iCol = 0;
            int iRow = 0;
            foreach (PropertyInfo eachPInfo in pInfos.Where(W => W.CanRead == true))
            {
                // Add column headings...
                iCol++;
                excel.Cells[1, iCol] = eachPInfo.Name;
            }
            foreach (T item in exportData)
            {
                iRow++;
                // add each row's cell data...
                iCol = 0;
                foreach (PropertyInfo eachPInfo in pInfos.Where(W => W.CanRead == true))
                {
                    iCol++;
                    excel.Cells[iRow + 1, iCol] = eachPInfo.GetValue(item, null);
                }

            }
            // Global missing reference for objects we are not defining...
            object missing = System.Reflection.Missing.Value;
            // If wanting to Save the workbook...   
            string filePath = System.IO.Path.GetTempPath() + DateTime.Now.Ticks.ToString() + ".xlsm";
            workbook.SaveAs(filePath, Excel.XlFileFormat.xlOpenXMLWorkbookMacroEnabled, missing, missing, false, false, Excel.XlSaveAsAccessMode.xlNoChange, missing, missing, missing, missing, missing);
            // If wanting to make Excel visible and activate the worksheet...
            excel.Visible = true;
            Excel.Worksheet worksheet = (Excel.Worksheet)excel.ActiveSheet;
            excel.Rows.EntireRow.AutoFit();
            excel.Columns.EntireColumn.AutoFit();
            ((Excel._Worksheet)worksheet).Activate();
        }
    }

我有一個DataTable我需要放入Excel 2007格式並將其保存為excel文件(.xlsx)2007。

任何人都可以幫我實現這個目標嗎?

您只需要將我的免費C#類添加到您的項目中,並添加一行代碼。

完整的詳細信息(可免費下載的源代碼和示例項目)在這里:

Mikes知識庫 - 導出到Excel

我的庫使用免費的Microsoft OpenXML庫(也在我的下載中提供)來編寫文件,因此您不必使用重量級VSTO庫,也不必在服務器上安裝Excel。

此外,它創建一個真正的 .xlsx文件,而不是將數據流寫入逗號分隔的文本文件的其他方法,但將其命名為.xls文件。

順便說一句,我使用OLEDB,這不僅是因為我運行的是Windows 7 64位,與Office 2007(這是32位)和Microsoft ACE供應商必須是 64位具有寫入Excel文件困難負荷如果您安裝了32位版本的Office,則無法安裝此版本。

因此,您必須卸載Office,安裝ACE驅動程序,然后重新安裝Office。
但即便如此,我放棄使用OLEDB ..它只是不夠穩定。

在我5年前做過的一些舊代碼中找到了這個應該可行...

public static void DataTableToExcel(DataTable tbl)
{
    HttpContext context = HttpContext.Current;
    context.Response.Clear();
    foreach (DataColumn c in tbl.Columns)
    {
        context.Response.Write(c.ColumnName + ";");
    }
    context.Response.Write(Environment.NewLine);
    foreach (DataRow r in tbl.Rows)
    {
        for (int i = 0; i < tbl.Columns.Count; i++)
        {
            context.Response.Write(r[i].ToString().Replace(";", string.Empty) + ";");
        }
        context.Response.Write(Environment.NewLine);
    }
    context.Response.ContentType = "text/csv";
    context.Response.AppendHeader("Content-Disposition",
        "attachment; filename=export.csv");
    context.Response.End();
}

這將從ASP.NET輸出一個包含Excel 2007可以打開的CSV文件的響應。 如果你想要你可以改變擴展模仿excel,它應該只需更換以下行:

    context.Response.ContentType = "application/vnd.ms-excel";
    context.Response.AppendHeader("Content-Disposition",
        "attachment; filename=export.xlsx");

如果您不需要執行任何復雜的操作,則CSV是最簡單的方法。 如果確實要求它真正是本機格式的Excel 2007文件,則需要使用Office庫來構建它或將其從CSV轉換然后提供/保存。

此鏈接也可能有用:

將數據導出到Excel 2007時如何避免Excel提示窗口

看到其他人發布了“保存到csv”選項。 雖然這似乎不是OP正在尋找的答案,但這是我的版本,包括表格的標題

    public static String ToCsv(DataTable dt, bool addHeaders)
    {
        var sb = new StringBuilder();
        //Add Header Header
        if (addHeaders)
        {
            for (var x = 0; x < dt.Columns.Count; x++)
            {
                if (x != 0) sb.Append(",");
                sb.Append(dt.Columns[x].ColumnName);
            }
            sb.AppendLine();
        }
        //Add Rows
        foreach (DataRow row in dt.Rows)
        {
            for (var x = 0; x < dt.Columns.Count; x++)
            {
                if (x != 0) sb.Append(",");
                sb.Append(row[dt.Columns[x]]);
            }
            sb.AppendLine();
        }
        return sb.ToString();
    }

你需要做很多互操作,這是一個教程,希望它有所幫助。 鏈接文字

暫無
暫無

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

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