在类/对象中使用Excel对象(工作表,工作簿...)
问题描述:
我在将Excel工作表导入到摘要工作簿时遇到问题。在类/对象中使用Excel对象(工作表,工作簿...)
首先,我尝试导入数据,数据表,使用:
`Dt = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
tableName = GetTableNames(Dt);
com = new OleDbDataAdapter(SqlQuery(tableName[0]), conn);
com.Fill(DtSet);
Dt = DtSet.Tables[0];`
工作正常,除了一个事实,即一些标题的迷路了,该数据后复制到新的工作表:
private static void ImportData(DataTable source, string p)
{
int pos = Globals.ThisWorkbook.Sheets.Count;
object lastSheet = Globals.ThisWorkbook.Sheets.get_Item(pos);
Globals.ThisWorkbook.Sheets.Add(Type.Missing, lastSheet, Type.Missing, Type.Missing);
Excel.Worksheet ws = (Excel.Worksheet)Globals.ThisWorkbook.ActiveSheet;
ws.Name = p;
// column headings
for (var i = 0; i < source.Columns.Count; i++)
{
ws.Cells[1, i + 1] = source.Columns[i].ColumnName;
}
// rows
for (var i = 0; i < source.Rows.Count; i++)
{
// to do: format datetime values before printing
for (var j = 0; j < source.Columns.Count; j++)
{
ws.Cells[i + 2, j + 1] = source.Rows[i][j];
}
}
}
其次,我希望导入修复由VIA互操作导入它,所以我实现了这个一个:
public Excel.Worksheet GetWorksheet(string path)
{
Excel.Application vApp = new Excel.Application();
Excel.Workbook vBook = vApp.Workbooks.Open(path);
Excel.Worksheet ws = vBook.Sheets.get_Item(1);
vBook.Close();
vApp.Quit();
return ws;
}
似乎也做工精细,直到我尝试将此表复制到活动工作簿:
private static void ImportData(Excel.Worksheet source, string p)
{
int pos = Globals.ThisWorkbook.Sheets.Count;
source.Copy(Globals.ThisWorkbook.Worksheets[pos]);
}
这应该内Globals.ThisWorkbook
源拷贝到最后的位置......但我的一切是收到COMException
现在我用尽了想法如何解决这个问题。 希望你能帮上忙。
Mirko
答
感谢的人张贴了这个位置:*
我需要加载源工作簿到活动的应用程序,而不是在开始自己的应用程序,并从那里得到的工作表:所有
Excel.Application destApp = Globals.ThisWorkbook.Application;
Excel.Workbook destWB = destApp.Workbooks[1];
Excel.Workbook sourceWB = destApp.Workbooks.Open(d.Path);
int pos = Globals.ThisWorkbook.Sheets.Count;
Excel.Worksheet destWS = ((Excel.Worksheet)destWB.Worksheets[pos]);
Excel.Worksheet sourceWS = ((Excel.Worksheet)sourceWB.Worksheets[1]);
sourceWS.Name = d.Name;
sourceWB.Save();
sourceWS.Copy(destWS);
sourceWB.Close();
那它的速度非常快。
答
我建议不要使用COM对象。尝试使用OpenXML和ClosedXML来动态创建Excel表。
[http://www.c-sharpcorner.com/article/closed-xml-to-read-excel-files-in-asp-net-c-sharp/]
希望这有助于!
Thansk您的评论,问题是使用外部库或软件是不允许在我的公司批准。该软件需要在两天内完成,审批需要很长时间。 :-) – Mirko
是的,我可以理解。你正在使用Microsoft.Interop.Excel权利?我也用过它。我们的产品托管在客户购买的云服务器上。我们无法说服我们的客户在服务器中安装Microsoft Office Primary Interop Assembly软件包。所以我使用了完全免费的openXML和ClosedXML。高效代码的性能也很好。 –