我有一些表格数据,我想把它变成Excel表格。
可用软件:
有关数据的信息:
在线搜索会产生很多结果,我很困惑我是否应该使用OleDb,ADO RecordSets或其他东西。其中一些技术对于我的场景来说似乎有点过头了,有些看起来可能已经过时了。
最简单的方法是什么?
编辑:这是我打算从我参加的桌面运行的一次性脚本。
答案 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对象,以下是我的方法。
模块顶部添加:
using Microsoft.Office.Interop.Excel;
添加如下事件逻辑:
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 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"
);
}