Основная причина, по которой вы не видите изменения, потому что вы пишете книгу на MemoryStream
вместо того, чтобы писать обратно в файл. То, что вы должны делать это:
- с использованием
FileStream
в Read
режиме, чтобы полностью прочитать файл электронной таблицы;
- внесения изменений вы хотите, то
- с использованием
FileStream
в Write
режим обратной записи в файл (или, возможно, записать в другой файл, если вы не хотите, чтобы уничтожить оригинал - это может быть лучше тестирование).
Также обратите внимание, что это хорошая практика, чтобы использовать using
заявления при работе с классами, которые реализуют IDisposable
(все Streams
делать). Это гарантирует, что файл будет закрыт, и все ресурсы, используемые потоком, будут очищены должным образом.
Есть еще одна проблема, которую я вижу в вашем коде, и это вы, по-видимому, пытаетесь использовать HSSFWorkbook
с файлом .xlsx
. Это не сработает. HSSFWorkbook
(и все классы HSSF
) предназначены для файлов .xls
. Если вам нужно работать с файлами .xlsx
, тогда вы должны использовать XSSFWorkbook
и соответствующие классы XSSF
. Обратите внимание, что оба класса классов реализуют общие интерфейсы, такие как IWorkbook
, ISheet
, IRow
и т. Д., Чтобы помочь уменьшить дублирование кода, если вам необходимо поддерживать оба типа файлов. Я рекомендую использовать их там, где это возможно. Но вы можете обнаружить, что вам по-прежнему необходимо периодически отключать доступ к некоторым функциям, которые не покрываются интерфейсами.
Еще одна вещь, которую я должен упомянуть: если конкретная строка x
не содержит ячеек в исходной книге, то GetRow(x)
вернет значение null. Аналогично, GetCell(y)
вернет значение null, если ячейка y
пуста. Если вы хотите, чтобы у вас было возможность установить значение ячейки независимо, вам нужно будет проверить наличие нулей и использовать CreateRow(x)
и/или CreateCell(y)
в зависимости от ситуации, чтобы обеспечить существование каждого соответствующего объекта.
Вот пересмотренный код:
string pathSource = @"C:\Users\mvmurthy\Downloads\VOExportTemplate.xlsx";
IWorkbook templateWorkbook;
using (FileStream fs = new FileStream(pathSource, FileMode.Open, FileAccess.Read))
{
templateWorkbook = new XSSFWorkbook(fs);
}
string sheetName = "ImportTemplate";
ISheet sheet = templateWorkbook.GetSheet(sheetName) ?? templateWorkbook.CreateSheet(sheetName);
IRow dataRow = sheet.GetRow(4) ?? sheet.CreateRow(4);
ICell cell = dataRow.GetCell(1) ?? dataRow.CreateCell(1);
cell.SetCellValue("foo");
using (FileStream fs = new FileStream(pathSource, FileMode.Create, FileAccess.Write))
{
templateWorkbook.Write(fs);
}
Лучший пример, показывающий, как писать в существующий файл по NPOI C# во всем интернете. – Jarkid