[英]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#类添加到您的项目中,并添加一行代码。
完整的详细信息(可免费下载的源代码和示例项目)在这里:
我的库使用免费的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转换然后提供/保存。
此链接也可能有用:
看到其他人发布了“保存到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.