如何将DataTable导出到Excel

129

我该怎么在C#中使用Windows Forms将 DataTable 导出到Excel? DataTable DataGridView 控件相关联。 我需要将 DataTable 的记录导出到Excel中。


最简单的方法是在items和subitems上进行嵌套的foreach循环。 - Dumbo
注意:如果您正在尝试从数据表传递值到对象,然后传递到Excel,则还应进行数据类型错误处理。例如,Guids会导致HRESULT:0x800A03EC异常而中断您的赋值。一个不需要测试数据类型的解决方法是在填充对象时使用“ToString()”。Excel将自动将数字转换回数字格式。FlashTrev已经解决了相关的日期/时间问题。 - u8it
我建议查看这个问题的答案:https://dev59.com/1HRB5IYBdhLWcg3wuZU1#536699 - Troy Cosentino
23个回答

0

关于 tuncalik 的答案,非常棒,尤其是如果你想试着玩一下这段代码 :) 但它将我的日期以美国格式放入Excel中,即2014年3月2日在英国是02/03/2014,而在美国则是03/02/2014,月份在日期之前。我需要它采用英国格式,请问有什么好的想法吗?

我已经检查过它以英国格式存储在我的DataTable中,而且我的Excel设置为英国,但由于某种原因,当它制作Excel文档时,它认为它是美国的(这是因为微软是一家美国公司吗?)

我会尝试使用区域设置代码进行实验,但不确定要在哪里放置。尝试过,但没有效果。

p.s.

我不得不更改一行代码才能使它正常工作,如下所示添加一个“cast”

// single worksheet
Excel._Worksheet workSheet = (Excel._Worksheet)excelApp.ActiveSheet;

更新:我通过转换为 LongDateTime 格式实现了日期的英国格式,不过这只是一个权宜之计。
DateTime startDate = Convert.ToDateTime(myList[0].ToString());
string strStartDate = startDate.ToLongDateString();
DateTime endDate = Convert.ToDateTime(myList[myListTotalRows].ToString());
string strEndDate = endDate.ToLongDateString();    

干杯。


0

虽然这是一个旧的帖子,但我想在这里分享我的代码。我写了一个小函数,将数据表写入到一个指定路径(位置)的新Excel工作表中。另外,你需要添加对Microsoft Excel 14.0库的引用。

我从这个线程中提取了一些关于如何将任何东西写入Excel的信息- 如何将数据写入Excel文件(.xlsx)

我使用这个来推断如何编写数据表。

*注意,在catch语句中,我有一个errorhandler静态类引用(你可以忽略这些)。

 using excel = Microsoft.Office.Interop.Excel;
 using System.IO;
 using System.Data;
 using System.Runtime.InteropServices;

 //class and namespace wrapper is not shown in this example 

 private void WriteToExcel(System.Data.DataTable dt, string location)
    {
        //instantiate excel objects (application, workbook, worksheets)
        excel.Application XlObj = new excel.Application();
        XlObj.Visible = false;
        excel._Workbook WbObj = (excel.Workbook)(XlObj.Workbooks.Add(""));
        excel._Worksheet WsObj = (excel.Worksheet)WbObj.ActiveSheet;

        //run through datatable and assign cells to values of datatable
        try
        {
            int row = 1; int col = 1;
            foreach (DataColumn column in dt.Columns)
            {
                //adding columns
                WsObj.Cells[row, col] = column.ColumnName;
                col++;
            }
            //reset column and row variables
            col = 1;
            row++;
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                //adding data
                foreach (var cell in dt.Rows[i].ItemArray)
                {
                    WsObj.Cells[row, col] = cell;
                    col++;
                }
                col = 1;
                row++;
            }
            WbObj.SaveAs(location);
        }
        catch (COMException x)
        {                
            ErrorHandler.Handle(x);
        }
        catch (Exception ex)
        {               
            ErrorHandler.Handle(ex);
        }
        finally
        {
            WbObj.Close();                
        }
    }

1
这个代码可以正常工作,但是你没有在之后关闭Excel进程,所以我建议添加以下内容,替换掉你的SaveAs行: 'XlObj.DisplayAlerts = false; WbObj.SaveAs(location); WbObj.Close(); XlObj.Quit(); Marshal.ReleaseComObject(WsObj); Marshal.ReleaseComObject(WbObj); Marshal.ReleaseComObject(XlObj);'要使用Marshal.ReleaseComObject方法,请将using System.Runtime.InteropServices程序集添加到您的项目中。 - GrammatonCleric

0

导出Excel的简单方法是使用Microsoft CloseXml包。我编写了一个简单的函数,将查询结果导出为Excel表格(我为此而编写,但在进行微小更改后可用于Windows应用程序):

using ClosedXML.Excel;
...
public ActionResult ToExcel(List<Dictionary<string, string>> data, Dictionary<string, string> columnMap, string fileName, string sheetName)
{
    var dtDataBuffer = new System.Data.DataTable("buffer");

    foreach (string col in columnMap.Values)
    {
        dtDataBuffer.Columns.Add(col, typeof(string));
    }



    foreach (var row in data)
    {
        List<string> rowData = new List<string> { };


        foreach (string col in columnMap.Keys)
        {
            rowData.Add(row[col]);
        }

        dtDataBuffer.Rows.Add(rowData.ToArray());
    }




    var memoryStream = new MemoryStream();

    using (var workbook = new XLWorkbook())
    {
        var worksheet = workbook.Worksheets.Add(dtDataBuffer, sheetName);
        worksheet.Rows().Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;
        worksheet.Rows().Style.Alignment.Vertical = XLAlignmentVerticalValues.Center;
        worksheet.Columns().AdjustToContents();
        workbook.SaveAs(memoryStream);
    }

    return File(memoryStream.ToArray(), "application/vnd.ms-excel", fileName);
}

这是一个使用示例(实际上,我使用自己的类来运行查询并生成数据。您可以在此处找到OracleSQL Server):

public ActionResult myReportExport(){
    var data=List<Dictionary<string, string>>(){
        {{"Column1_Index","Column1_Value"},{"Column2_Index","Column2_Value"},...}
        ...
    };
    
    
    return ToExcel(data, new Dictionary<string, string> {
            { "Column1_Index", "Column1 Title" } ,
            { "Column2_Index", "Column2 Title" } ,
            ...
        },
        "myFileName.xlsx",
        "my sheet name"
    );
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接