OpenXML - 创建并打开 Excel 文件而不保存
OpenXML - Create and Open Excel File without saving It
我有一段代码可以使用 OpenXML 从 Datatable 创建一个新的 Excel 文件。创建完此文件后,我想为用户打开它但不保存它。基本上,Excel 在这种情况下所做的是将 excel 文件打开为 "Workbook1",然后如果您希望手动保存它。我有这个需求是因为用户想在保存文件到磁盘之前检查数据是否对应。
这可以在 Interop by Visibility 中完成 属性(我已经有了这个解决方案,但问题是 Interop 在处理大量数据时速度非常慢,因此用户对它不满意),但我不能'找不到在 OpenXML 中执行相同操作的方法。如果有人有任何建议,请告诉我。这是我创建 Excel 文件的代码:
public void Export_To_Excel_stream(MemoryStream ms, DataTable dt)
{
using (SpreadsheetDocument dokument = SpreadsheetDocument.Create(ms, SpreadsheetDocumentType.Workbook))
{
WorkbookPart workbookPart = dokument.AddWorkbookPart();
workbookPart.Workbook = new Workbook();
WorksheetPart worksheetPart = workbookPart.AddNewPart<WorksheetPart>();
var sheetData = new SheetData();
worksheetPart.Worksheet = new Worksheet(sheetData);
Sheets sheets = workbookPart.Workbook.AppendChild(new Sheets());
Sheet sheet = new Sheet() { Id = workbookPart.GetIdOfPart(worksheetPart), SheetId = 1, Name = dt.TableName };
sheets.Append(sheet);
//header row
Row header = new Row();
List<String> Cols = new List<string>();
foreach (DataColumn col in dt.Columns)
{
Cols.Add(col.ColumnName);
Cell cell = new Cell
{
DataType = CellValues.String,
CellValue = new CellValue(col.ColumnName)
};
header.AppendChild(cell);
}
sheetData.AppendChild(header);
foreach (DataRow row in dt.Rows)
{
Row new_row = new Row();
foreach (String col in Cols)
{
Cell cell = new Cell
{
DataType = CellValues.String,
CellValue = new CellValue(row[col].ToString())
};
new_row.AppendChild(cell);
}
sheetData.AppendChild(new_row);
}
workbookPart.Workbook.Save();
}
我想到的最好的事情是打开 Excel 文件作为进程,然后在进程结束时删除它。但是,我的 OpenXML 代码是一个 .dll,所以当我关闭已经打开的 Excel 文件的应用程序时,它不会再自动删除:
public string file_path;
public void Export_To_Excel_stream(MemoryStream ms, DataTable dt)
{
//...at the end, whe OPENXML file is created..
var open_Excel = Process.Start(file_path);
open_Excel.EnableRaisingEvents = true;
open_Excel.Exited += new EventHandler(open_excel_Exited);
}
public void open_excel_Exited(object sender, EventArgs e)
{
File.Delete(file_path);
}
如果有人有更好的解决方案,我会非常高兴:)
我有一段代码可以使用 OpenXML 从 Datatable 创建一个新的 Excel 文件。创建完此文件后,我想为用户打开它但不保存它。基本上,Excel 在这种情况下所做的是将 excel 文件打开为 "Workbook1",然后如果您希望手动保存它。我有这个需求是因为用户想在保存文件到磁盘之前检查数据是否对应。
这可以在 Interop by Visibility 中完成 属性(我已经有了这个解决方案,但问题是 Interop 在处理大量数据时速度非常慢,因此用户对它不满意),但我不能'找不到在 OpenXML 中执行相同操作的方法。如果有人有任何建议,请告诉我。这是我创建 Excel 文件的代码:
public void Export_To_Excel_stream(MemoryStream ms, DataTable dt)
{
using (SpreadsheetDocument dokument = SpreadsheetDocument.Create(ms, SpreadsheetDocumentType.Workbook))
{
WorkbookPart workbookPart = dokument.AddWorkbookPart();
workbookPart.Workbook = new Workbook();
WorksheetPart worksheetPart = workbookPart.AddNewPart<WorksheetPart>();
var sheetData = new SheetData();
worksheetPart.Worksheet = new Worksheet(sheetData);
Sheets sheets = workbookPart.Workbook.AppendChild(new Sheets());
Sheet sheet = new Sheet() { Id = workbookPart.GetIdOfPart(worksheetPart), SheetId = 1, Name = dt.TableName };
sheets.Append(sheet);
//header row
Row header = new Row();
List<String> Cols = new List<string>();
foreach (DataColumn col in dt.Columns)
{
Cols.Add(col.ColumnName);
Cell cell = new Cell
{
DataType = CellValues.String,
CellValue = new CellValue(col.ColumnName)
};
header.AppendChild(cell);
}
sheetData.AppendChild(header);
foreach (DataRow row in dt.Rows)
{
Row new_row = new Row();
foreach (String col in Cols)
{
Cell cell = new Cell
{
DataType = CellValues.String,
CellValue = new CellValue(row[col].ToString())
};
new_row.AppendChild(cell);
}
sheetData.AppendChild(new_row);
}
workbookPart.Workbook.Save();
}
我想到的最好的事情是打开 Excel 文件作为进程,然后在进程结束时删除它。但是,我的 OpenXML 代码是一个 .dll,所以当我关闭已经打开的 Excel 文件的应用程序时,它不会再自动删除:
public string file_path;
public void Export_To_Excel_stream(MemoryStream ms, DataTable dt)
{
//...at the end, whe OPENXML file is created..
var open_Excel = Process.Start(file_path);
open_Excel.EnableRaisingEvents = true;
open_Excel.Exited += new EventHandler(open_excel_Exited);
}
public void open_excel_Exited(object sender, EventArgs e)
{
File.Delete(file_path);
}
如果有人有更好的解决方案,我会非常高兴:)