我需要阅读50MB .XLS excel,但我收到此错误:
System.IO.FileFormatException {"File contains corrupted data."}
我选择OpenXMLReader类进行阅读,因为它似乎适合这种情况。 但它在第一行代码上崩溃了。
SpreadsheetDocument.Open(filename, false)
可以在此处下载Excel文件: http://www.filedropper.com/saxfile其简单的97-2003 excel测试文件,包含10行
static void Main(string[] args)
{
ReadExcelFileSAX(@"C:\Users\User\Desktop\SAXFile.xls");
}
static void ReadExcelFileSAX(string filename)
{
using (SpreadsheetDocument myDoc = SpreadsheetDocument.Open(filename, false))
{
WorkbookPart workbookPart = myDoc.WorkbookPart;
WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();
OpenXmlReader reader = OpenXmlReader.Create(worksheetPart);
string text;
while (reader.Read())
{
if (reader.ElementType == typeof(CellValue))
{
text = reader.GetText();
Console.WriteLine(text);
}
}
}
}
我缺少什么?
答案 0 :(得分:4)
您尝试打开的文件是一个OpenXML二进制格式的Excel文件。
我确定读者一旦检测到它不是有效的ZIP存档就会引发错误。
答案 1 :(得分:0)
使用OpenXML之前的这段代码会有所帮助(它将xls保存为xlsx),但它的一点点解决方法
static void ConvertXlsToXlsx(string xlsFilePath, string xlsxFilePath)
{
Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();
excelApp.Visible = false;
Microsoft.Office.Interop.Excel.Workbook eWorkbook = excelApp.Workbooks.Open(xlsFilePath, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
eWorkbook.SaveAs(xlsxFilePath, Microsoft.Office.Interop.Excel.XlFileFormat.xlOpenXMLWorkbook, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
eWorkbook.Close(false, Type.Missing, Type.Missing);
}
更好的解决方案是使用不同的库ExcelDataReader https://exceldatareader.codeplex.com/ 我测试和工作(例如打印.CSV到控制台)
static void XLSFileStreamReader(string filePath)
{
FileStream stream = new FileStream(filePath, FileMode.Open);
// Reading from a binary Excel file ('97-2003 format; *.xls)
IExcelDataReader excelReader2003 = ExcelReaderFactory.CreateBinaryReader(stream);
// DataSet - The result of each spreadsheet will be created in the result.Tables
DataSet result = excelReader2003.AsDataSet();
// Data Reader methods
foreach (DataTable table in result.Tables)
{
for (int i = 0; i < table.Rows.Count; i++)
{
for (int j = 0; j < table.Columns.Count; j++)
Console.Write("\"" + table.Rows[i].ItemArray[j] + "\";");
Console.WriteLine();
}
}
// Free resources (IExcelDataReader is IDisposable)
excelReader2003.Close();
}
我在https://gist.github.com/Munawwar/924413
找到了它PS:FileStream可能应该在USING块中。