#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