C# 将HTML从MemoryStream保存到Excel文件
我在MemoryStream(C#)中有一个XSLT转换的HTML数据。我试图在发送电子邮件之前将其转换为Excel格式,最好在内存中再次转换,而不保存到本地磁盘。我可以稍后再讨论电子邮件附件部分。有人能给我举个例子,告诉我如何通过OpenXML或Office.Interop.Excel将HTML格式转换为Excel格式 HTML数据格式良好,我可以通过在Excel应用程序中打开HTML手动进行转换,并执行另存为以xlsx格式保存(Office 2010),没有问题。我还试图简单地将.html扩展名改为.xlsx,但excel抱怨说要打开它 自动化手动SaveAs操作的最佳方法是什么,这样我就可以使用Excel格式的相同html数据?我知道我可以创建一个单独的.xslt来直接将XML转换为Excel格式。但是,要维护的.xslt太多了。我正试图找到让Excel为我做这项工作的方法 感谢您提前提出的所有建议 编辑: 我想我别无选择,只能将html存储到磁盘,并将其读回,然后使用Excel Interop来执行SaveAs方法。但当我确实尝试时,在SaveAs方法上获得了HRESULT:0x800A03EC异常。下面是如何复制它 复制行为的步骤C# 将HTML从MemoryStream保存到Excel文件,c#,html,xml,excel,xslt,C#,Html,Xml,Excel,Xslt,我在MemoryStream(C#)中有一个XSLT转换的HTML数据。我试图在发送电子邮件之前将其转换为Excel格式,最好在内存中再次转换,而不保存到本地磁盘。我可以稍后再讨论电子邮件附件部分。有人能给我举个例子,告诉我如何通过OpenXML或Office.Interop.Excel将HTML格式转换为Excel格式 HTML数据格式良好,我可以通过在Excel应用程序中打开HTML手动进行转换,并执行另存为以xlsx格式保存(Office 2010),没有问题。我还试图简单地将.html扩
测试标题
作为C:\Test.html
有什么想法吗?此代码有效。事实证明,我得到的异常只与我试图保存的文件格式有关。当我把它改为打开XML工作簿时,它保存得很好
using Excel = Microsoft.Office.Interop.Excel;
.
.
.
var app = new Excel.Application();
Excel.Workbook wb = null;
try
{
wb = app.Workbooks.Open(@"c:\test.html");
wb.SaveAs(@"c:\test.xlsx", Excel.XlFileFormat.xlOpenXMLWorkbook);
//wb.SaveCopyAs(@"c:\test.xlsx");
wb.Close();
}
catch (Exception ex)
{
//_logger.Error(ex);
}
finally
{
app.Quit();
}
下面是更新后的代码,它以字节[]html作为输入,并以字节[]返回xlsx
public static byte[] DoConvertXlDataToOpenXml(byte[] data, FileInfo fileInfo)
{
ExcelInterop.Application excelApp = null;
ExcelInterop.Workbooks workBooks = null;
ExcelInterop.Workbook workBook = null;
FileInfo tempFile = null;
FileInfo convertedTempFile = null;
try
{
//Stream the file to temporary location, overwrite if exists
tempFile = new FileInfo(Path.ChangeExtension(Path.Combine(Path.GetTempFileName()), fileInfo.Extension));
using (var destStream = new FileStream(tempFile.FullName, FileMode.Create, FileAccess.Write))
{
destStream.Write(data, 0, data.Length);
}
//open original
excelApp = new ExcelInterop.Application();
excelApp.Visible = false;
excelApp.DisplayAlerts = false;
workBooks = excelApp.Workbooks;
workBook = workBooks.Open(tempFile.FullName);
convertedTempFile = new FileInfo(Path.ChangeExtension(Path.GetTempFileName(), "XLSX"));
//Save as XLSX
excelApp.Application.ActiveWorkbook.SaveAs(
convertedTempFile.FullName
, Microsoft.Office.Interop.Excel.XlFileFormat.xlOpenXMLWorkbook
, ConflictResolution: ExcelInterop.XlSaveConflictResolution.xlLocalSessionChanges);
excelApp.Application.ActiveWorkbook.Close();
return File.ReadAllBytes(convertedTempFile.FullName);
}
catch (Exception)
{
throw;
}
finally
{
if (workBooks != null)
Marshal.ReleaseComObject(workBooks);
if (workBook != null)
Marshal.ReleaseComObject(workBook);
if (excelApp != null)
Marshal.ReleaseComObject(excelApp);
if (tempFile != null && tempFile.Exists)
tempFile.Delete();
if (convertedTempFile != null && convertedTempFile.Exists)
{
convertedTempFile.Delete();
}
}
}
我尝试了下面的代码来使用OpenXML库打开html。但是它给出了一个关于输入流中无效字符的错误代码
var doc=SpreadsheetDocument.Open(resultsHTML.ToString(),false)代码>其中resultsHTML是一个StringWriter对象,HTMLShot在黑暗中:请尝试其他文件夹。由于宏安全设置,Office应用程序有时与根C:\存在权限问题。如果可以的话,试试桌面。谢谢你的提示。我尝试了不同的本地文件夹,除此之外,仍然有同样的例外。当然,如果您通过在Excel中打开.html并手动操作Excel工作簿来进行同样的操作,它会按需要工作。如果您只打开一个空白工作簿,并保存空白工作簿,它会起作用吗?这将隔离问题是保存过程还是文件内容。您可以使用Excel Interop的SaveAs方法将html文件保存到xlsx中,但这需要您将Memorystream转储到html文件中,然后执行SaveAs。或者,您可以使用xslt样式表和Excel输出目标直接将XML转换为Excel文件(xlsx)。
public static byte[] DoConvertXlDataToOpenXml(byte[] data, FileInfo fileInfo)
{
ExcelInterop.Application excelApp = null;
ExcelInterop.Workbooks workBooks = null;
ExcelInterop.Workbook workBook = null;
FileInfo tempFile = null;
FileInfo convertedTempFile = null;
try
{
//Stream the file to temporary location, overwrite if exists
tempFile = new FileInfo(Path.ChangeExtension(Path.Combine(Path.GetTempFileName()), fileInfo.Extension));
using (var destStream = new FileStream(tempFile.FullName, FileMode.Create, FileAccess.Write))
{
destStream.Write(data, 0, data.Length);
}
//open original
excelApp = new ExcelInterop.Application();
excelApp.Visible = false;
excelApp.DisplayAlerts = false;
workBooks = excelApp.Workbooks;
workBook = workBooks.Open(tempFile.FullName);
convertedTempFile = new FileInfo(Path.ChangeExtension(Path.GetTempFileName(), "XLSX"));
//Save as XLSX
excelApp.Application.ActiveWorkbook.SaveAs(
convertedTempFile.FullName
, Microsoft.Office.Interop.Excel.XlFileFormat.xlOpenXMLWorkbook
, ConflictResolution: ExcelInterop.XlSaveConflictResolution.xlLocalSessionChanges);
excelApp.Application.ActiveWorkbook.Close();
return File.ReadAllBytes(convertedTempFile.FullName);
}
catch (Exception)
{
throw;
}
finally
{
if (workBooks != null)
Marshal.ReleaseComObject(workBooks);
if (workBook != null)
Marshal.ReleaseComObject(workBook);
if (excelApp != null)
Marshal.ReleaseComObject(excelApp);
if (tempFile != null && tempFile.Exists)
tempFile.Delete();
if (convertedTempFile != null && convertedTempFile.Exists)
{
convertedTempFile.Delete();
}
}
}