Копирование данных с одного листа на другой с использованием NPOI

#c# #.net #excel #npoi

#c# #.net #excel #npoi

Вопрос:

Я новичок в C # и Excel, и я пытаюсь скопировать данные с одного листа (который заполнен данными) на новый, который пуст. Я использую NPOI, и я выяснил несколько вещей, но у меня возникают проблемы при добавлении данных.

Второй лист пуст, поэтому все ячейки пусты (пожалуйста, поправьте меня, если я ошибаюсь). Когда я пытаюсь скопировать данные с первого листа на второй, ничего не происходит: ячейки не заполнены.

 using (FileStream fs = new FileStream(@"C:UsersMyDoc.xlsx", FileMode.Open, FileAccess.ReadWrite))
{
    XSSFWorkbook templateWorkbook = new XSSFWorkbook(fs);

    //Load the sheets needed
    var sheettoget = templateWorkbook.GetSheet("Sheet1");
    var sheettoadd = templateWorkbook.GetSheet("Sheet2");

    XSSFRow row =  (XSSFRow)sheettoadd.CreateRow(0);
    var cell = row.CreateCell(0);             
    var data = sheettoget.GetRow(0).GetCell(4).StringCellValue.ToString();
    cell.SetCellValue(data); //the cell is not populated
}
  

Ответ №1:

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

 // Read the file into a workbook
XSSFWorkbook templateWorkbook;
using (FileStream fs = new FileStream(@"C:TempMyDoc.xlsx", FileMode.Open, FileAccess.Read))
{
    templateWorkbook = new XSSFWorkbook(fs);
}

// Load the sheets needed (if the new sheet doesn't already exist, create it)
var sheettoget = templateWorkbook.GetSheet("Sheet1");
var sheettoadd = templateWorkbook.GetSheet("Sheet2");
if (sheettoadd == null)
{
    sheettoadd = templateWorkbook.CreateSheet("Sheet2");
}

// Make changes
XSSFRow row = (XSSFRow)sheettoadd.CreateRow(0);
var cell = row.CreateCell(0);
var data = sheettoget.GetRow(0).GetCell(4).StringCellValue.ToString();
cell.SetCellValue(data);

// Write the changes back to the file
using (FileStream fs = new FileStream(@"C:TempMyDoc.xlsx", FileMode.Create, FileAccess.Write))
{
    templateWorkbook.Write(fs);
}
  

Если вы пытаетесь скопировать весь лист, вам не нужно делать это ячейка за ячейкой. У NPOI есть CopySheet метод, который вы можете использовать для этого:

 sheettoget.CopySheet("Sheet2", true);
  

Комментарии:

1. Привет, я внес предложенные вами изменения, но первый лист полностью удален. Есть ли способ предотвратить это?

2. Хм, этого не происходит, когда я пытаюсь использовать приведенный выше код. Вы уверены, что случайно не перезаписываете Лист1? Целью CreateSheet (или CopySheet) должно быть «Sheet2».

3. ops, я проверил и вместо записи в sheet2 я писал в sheet1. Извините. Большое вам спасибо за помощь: D