Excel byte[] (OLE) 到 xls c#
Excel byte[] (OLE) to xls c#
我正在尝试使用 VB for Access 解析保存在 SQL 数据库中的 .xls 文档。它被保存为 OLE 文档。
我所做的是使用二进制编写器编写文档
FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite);
BinaryWriter bw = new BinaryWriter(fs, document.GetTextEncoding());
bw.Write(document);
bw.Close();
fs.Close();
所以,文件已保存,但是当我在 Office365 上打开它时,它给我一个灰色页面:
但是,Windows 资源管理器预览显示文档!!!!
我尝试使用 Microsoft Interop 打开文件并保存,但我得到了相同的结果。我尝试使用 HSSFWorkbook 复制到一个新文件,但发生了同样的情况。对于 .doc、.jpg、.pdf,我首先尝试在文件中分配 header 以获得二进制编写器的起始位置,但我不知道 .xls 是否具有这种 header。 (大部分.pdf, .doc, .jpg文件都可以打开)
这是互操作代码:
excel.Workbooks.Open(filePath, Notify: false, CorruptLoad: Microsoft.Office.Interop.Excel.XlCorruptLoad.xlRepairFile).
SaveAs(filePath, Microsoft.Office.Interop.Excel.XlFileFormat.xlExcel5, Type.Missing, Type.Missing, true, false, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, XlSaveConflictResolution.xlLocalSessionChanges, Type.Missing, Type.Missing);
已尝试更改 XLFileFormat,有时甚至无法预览。
HSSF代码:
HSSFWorkbook hssfwb;
using (FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
hssfwb = new HSSFWorkbook(file);
file.Close();
}
FileStream file2 = new FileStream(filePath+ "_mod", FileMode.Create, FileAccess.Write);
hssfwb.Write(file2);
file2.Close();
也是一样,可以预览但是打不开
编辑
文件:
byte[] doc = (byte[])reader["DEX_Documento"];
它是从数据库中读取的,它是一个解析为字节的十六进制字符串。不幸的是,由于法律条款,很难找到我可以给你字符串的文件。
此外,我可以使用 HSSF 解决方案读取行,但问题仍然存在。
所以我终于找到了一个不使用 Office 的库。
Spire.Xls.Workbook wbFromStream = new Spire.Xls.Workbook();
FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read);
wbFromStream.LoadFromStream(file);
wbFromStream.SaveToFile(filePath+".xls", Spire.Xls.ExcelVersion.Version2013);
file.Close();
我正在尝试使用 VB for Access 解析保存在 SQL 数据库中的 .xls 文档。它被保存为 OLE 文档。
我所做的是使用二进制编写器编写文档
FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite);
BinaryWriter bw = new BinaryWriter(fs, document.GetTextEncoding());
bw.Write(document);
bw.Close();
fs.Close();
所以,文件已保存,但是当我在 Office365 上打开它时,它给我一个灰色页面:
但是,Windows 资源管理器预览显示文档!!!!
我尝试使用 Microsoft Interop 打开文件并保存,但我得到了相同的结果。我尝试使用 HSSFWorkbook 复制到一个新文件,但发生了同样的情况。对于 .doc、.jpg、.pdf,我首先尝试在文件中分配 header 以获得二进制编写器的起始位置,但我不知道 .xls 是否具有这种 header。 (大部分.pdf, .doc, .jpg文件都可以打开)
这是互操作代码:
excel.Workbooks.Open(filePath, Notify: false, CorruptLoad: Microsoft.Office.Interop.Excel.XlCorruptLoad.xlRepairFile).
SaveAs(filePath, Microsoft.Office.Interop.Excel.XlFileFormat.xlExcel5, Type.Missing, Type.Missing, true, false, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, XlSaveConflictResolution.xlLocalSessionChanges, Type.Missing, Type.Missing);
已尝试更改 XLFileFormat,有时甚至无法预览。
HSSF代码:
HSSFWorkbook hssfwb;
using (FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
hssfwb = new HSSFWorkbook(file);
file.Close();
}
FileStream file2 = new FileStream(filePath+ "_mod", FileMode.Create, FileAccess.Write);
hssfwb.Write(file2);
file2.Close();
也是一样,可以预览但是打不开
编辑
文件:
byte[] doc = (byte[])reader["DEX_Documento"];
它是从数据库中读取的,它是一个解析为字节的十六进制字符串。不幸的是,由于法律条款,很难找到我可以给你字符串的文件。
此外,我可以使用 HSSF 解决方案读取行,但问题仍然存在。
所以我终于找到了一个不使用 Office 的库。
Spire.Xls.Workbook wbFromStream = new Spire.Xls.Workbook();
FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read);
wbFromStream.LoadFromStream(file);
wbFromStream.SaveToFile(filePath+".xls", Spire.Xls.ExcelVersion.Version2013);
file.Close();