我在MemoryStream中使用XSLT转换了HTML数据(在C#中)。我试图在发送电子邮件之前将其转换为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获取异常。以下是如何重现它。
重现行为的步骤
<html><head></head><body><center><h1>Test Header</h1></center></body></html>
为C:\ Test.html
使用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.xlOpenDocumentSpreadsheet);
//wb.SaveCopyAs(@"c:\test.xlsx");
wb.Close();
}
catch (Exception ex)
{
//_logger.Error(ex);
}
finally
{
app.Quit();
}
`
无论我选择哪种文件格式,甚至在那里都没有提到fileformat,我总是在SaveAs上得到提到的异常..
有什么想法吗?
答案 0 :(得分:0)
此代码有效。事实证明,我得到的异常只与我试图保存的文件格式有关。当我将其更改为Open 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();
}
答案 1 :(得分:0)
这里是更新的代码,它将bytes [] 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();
}
}
}