将MemoryStream中的HTML保存到Excel文件中

时间:2014-08-11 22:05:24

标签: c# html xml excel xslt

我在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获取异常。以下是如何重现它。

重现行为的步骤

  1. 保存此文字
  2. <html><head></head><body><center><h1>Test Header</h1></center></body></html>

    为C:\ Test.html

    1. 在像这样参考Excel互操作后,
    2. 使用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上得到提到的异常..

      有什么想法吗?

2 个答案:

答案 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();
                }
            }
        }