2016-08-17 4 views
1

Я написал следующий код для редактирования файла Excel с использованием библиотеки C# и NPOI. Ошибок нет, но после запуска кода, если я открою файл, значение ячейки не будет изменено. Что я делаю не так?Пытается изменить значение ячейки существующего файла Excel с помощью NPOI

namespace Project37 
{ 
    class Class1 
    { 
     public static void Main() 
     { 
      string pathSource = @"C:\Users\mvmurthy\Downloads\VOExportTemplate.xlsx"; 

      FileStream fs = new FileStream(pathSource, FileMode.Open, FileAccess.ReadWrite); 
      HSSFWorkbook templateWorkbook = new HSSFWorkbook(fs, true); 
      HSSFSheet sheet = (HSSFSheet)templateWorkbook.GetSheet("ImportTemplate"); 
      HSSFRow dataRow = (HSSFRow)sheet.GetRow(4); 

      dataRow.GetCell(1).SetCellValue("foo"); 

      MemoryStream ms = new MemoryStream(); 
      templateWorkbook.Write(ms); 
     }  
    } 
} 

ответ

1

Основная причина, по которой вы не видите изменения, потому что вы пишете книгу на MemoryStream вместо того, чтобы писать обратно в файл. То, что вы должны делать это:

  1. с использованием FileStream в Read режиме, чтобы полностью прочитать файл электронной таблицы;
  2. внесения изменений вы хотите, то
  3. с использованием 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); 
} 
+0

Лучший пример, показывающий, как писать в существующий файл по NPOI C# во всем интернете. – Jarkid

Смежные вопросы