Странный XLS-файл, сбой при использовании ExcelDataReader - PullRequest
0 голосов
/ 08 сентября 2018

Я работаю с электронной таблицей XLS, созданной из стороннего программного обеспечения. Если я открою файл в текстовом редакторе, очевидно, что это HTML, сохраненный в виде файла XLS. Похоже, что MS использовал этот шаблон и недавно остановился в Excel из-за пары найденных статей:

Итак, теперь к актуальному техническому вопросу. Если я отправляю файл (в виде потока) непосредственно в ExcelDataReader, используя метод CreateReader, он выдает эту ошибку:

«Неверная подпись файла.»

IExcelDataReader excelReader;
excelReader = ExcelReaderFactory.CreateReader(stream);

Если, с другой стороны, я открываю его в Excel, делаю «Сохранить как» и сохраняю XLS как XLSX, а затем отправляю его в мой код; он хорошо импортирует.

Я бы предпочел не заставлять моего пользователя делать шаг «Сохранить как». И заставить стороннего поставщика изменить свой формат нереально (как мы все знаем).

Какие-нибудь рекомендации или, может быть, хитрости, чтобы заставить это работать с ExcelDataReader?

Вот скриншот того, что я вижу, если открыть XLS в Notepad ++ (обратите внимание на расширение xls): enter image description here

1 Ответ

0 голосов
/ 18 сентября 2018

Я бы предпочел не заставлять моего пользователя делать шаг «Сохранить как». И заставить стороннего поставщика изменить свой формат нереально (как мы все знаем).

Итак, я могу предложить вам использовать пакет Microsoft.Office.Interop.Excel, чтобы сохранить его в поддерживаемом формате перед чтением его ExcelDataReader следующим образом:

var app = new Microsoft.Office.Interop.Excel.Application();
var workbook = app.Workbooks.Open(htmlFileName);

if (File.Exists(excelFileName))
{
    File.Delete(excelFileName);
}

workbook.SaveAs(
    excelFileName,
    Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookDefault,
    Type.Missing, Type.Missing,  
    false, false,
    Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange,
    Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);

workbook.Close();
app.Quit();
app = null;
workbook = null;

using (var stream = File.Open(excelFileName, FileMode.Open, FileAccess.Read))
{
    var reader = ExcelReaderFactory.CreateReader(stream);
    // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...