Файл Excel, созданный с помощью C #, поврежден (ExcelExportEngine & IExportEngine) - PullRequest
0 голосов
/ 08 октября 2019

У меня есть приложение, созданное на C #, которое позволяет генерировать файл Excel из списка (List <>).

Код, который генерирует файл Excel, работал без проблем, но сегодня пользователь, который все ещеВ Windows 7 указано, что файл Excel создан, но при его открытии он не читается.

Код для создания файла Excel выглядит следующим образом:

IExportEngine engine = new ExcelExportEngine();
engine.AddData(productListExport);
MemoryStream memory = engine.Export();
FileStream fileStream;

SaveFileDialog saveFileDialog1 = new SaveFileDialog();
saveFileDialog1.Filter = "Excel files (*.xls or .xlsx)|.xls;*.xlsx";
saveFileDialog1.Title = "Export product list to Excel";
saveFileDialog1.ShowDialog();
                
if (saveFileDialog1.FileName != "")
{
 String path = Path.GetFullPath(saveFileDialog1.FileName);
 fileStream = new FileStream(path, FileMode.OpenOrCreate,  FileAccess.Write, FileShare.ReadWrite);
 memory.WriteTo(fileStream);
 fileStream.Close();
}
                

Когда вы открываете файл Excel, появляется сообщение о том, что формат и расширение не совпадают, если вы решите открыть опцию, чтобы открыть в любом случае, это выглядит какследующее изображение:

enter image description here

Любые предложения или комментарии приветствуются.

ОБНОВЛЕНИЕ:

О программе ExcelExportEngine:

https://github.com/vvenegasv/exportable

1 Ответ

2 голосов
/ 08 октября 2019

Снимок экрана выглядит как содержимое файла xlsx. Файл xlsx представляет собой zip-пакет, содержащий файлы XML. Различные пути к XML очень сильные признаки. Байт PK тоже, но сначала я увидел docProps.xml.

Сам код имеет серьезную проблему - он генерирует содержимое файла Excel до , запрашивая формат. Учитывая, что формат xls устарел 13 лет назад, единственным разумным значением по умолчанию является использование xlsx. Если файл xlsx сохранен как xls, Excel будет жаловаться. В моем случае, однако, он смог загрузить файл.

Похоже, код использует пакет Exportable . Примеры в репозитории Github показывают, как указать формат. Помимо MemoryStream Export(), в библиотеке также есть Export (строковый путь) , который записывает в файл. Исходный код показывает, что Export(string) выбирает формат на основе расширения и выбрасывает, если оно недопустимо.

Это означает, что код можно уменьшить до:

IExportEngine engine = new ExcelExportEngine();
engine.AddData(productListExport);

var saveFileDialog1 = new SaveFileDialog(){
    Filter = "Excel files (*.xls or .xlsx)|.xls;*.xlsx",
    Title = "Export product list to Excel"
}
saveFileDialog1.ShowDialog();

if (saveFileDialog1.FileName != "")
{
    var path = Path.GetFullPath(saveFileDialog1.FileName);
    engine.Export(path);
}

Я бы такжепредлагаем избавиться от опции xls тоже. Дело не только в том, что его заменили 13 лет назад. Формат не был четко определен для начала, поэтому у библиотек всегда возникают проблемы с тем же выводом, как в Excel. Такие службы, как Google Sheets или Office Online, работают только с xlsx. Вы должны заплатить , чтобы получить xls поддержку. Размер файла тоже намного меньше.

...