Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将HTML从MemoryStream保存到Excel文件_C#_Html_Xml_Excel_Xslt - Fatal编程技术网

C# 将HTML从MemoryStream保存到Excel文件

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扩

我在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:\Test.html

  • 在像这样引用Excel interop之后
  • 使用Excel=Microsoft.Office.Interop.Excel

    试试这个代码

    ` var app=new Excel.Application()

    Excel.Workbook wb=null

    `

    无论我选择哪种文件格式,甚至没有提到那里的文件格式,我都会在SaveAs上看到提到的异常


    有什么想法吗?

    此代码有效。事实证明,我得到的异常只与我试图保存的文件格式有关。当我把它改为打开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();
                    }
                }
            }