Класс OpenXml.Spreadsheet выдает ошибку FileFormatException в простом файле Excel

1

Мне нужно прочитать 50MB.XLS excel, но я получаю эту ошибку:

System.IO.FileFormatException {"File contains corrupted data."}

Я выбираю класс OpenXMLReader для чтения, потому что он, похоже, подходит для этого сценария. Но он падает на первую строку кода.

SpreadsheetDocument.Open(filename, false)

Файл Excel можно скачать здесь: http://www.filedropper.com/saxfile свой простой тестовый файл Excel 2003 с 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);
                }
            }
        }
    }

Что мне не хватает?

Теги:
openxml

2 ответа

4

Файл, который вы пытаетесь открыть, представляет собой файл Excel в формате pre-OpenXML.

Я уверен, что читатель вызывает ошибку, как только обнаруживает, что это не действительный ZIP-архив.

  • 0
    Спасибо за ваш ответ, но я не понимаю этого. Я хочу читать файлы Excel, так как я могу это сделать?
  • 1
    Для .XLSX Код работает, так что, возможно, можно ли программным образом изменить формат .xls на .xlsx? Это может быть по-другому.
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 блоке.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню