Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用NPOI将数据从一张图纸复制到另一张图纸_C#_.net_Excel_Npoi - Fatal编程技术网

C# 使用NPOI将数据从一张图纸复制到另一张图纸

C# 使用NPOI将数据从一张图纸复制到另一张图纸,c#,.net,excel,npoi,C#,.net,Excel,Npoi,我不熟悉C#和Excel,我正在尝试将数据从一张充满数据的工作表复制到一张空的新工作表。我正在使用NPOI,我已经解决了一些问题,但是我在添加数据时遇到了问题 第二张是空的,所以所有的单元格都是空的(如果我错了,请纠正我)。当我尝试将数据从第一张工作表复制到第二张工作表时,什么也没有发生:单元格没有填充 using (FileStream fs = new FileStream(@"C:\Users\MyDoc.xlsx", FileMode.Open, FileAccess.ReadWrite

我不熟悉C#和Excel,我正在尝试将数据从一张充满数据的工作表复制到一张空的新工作表。我正在使用NPOI,我已经解决了一些问题,但是我在添加数据时遇到了问题

第二张是空的,所以所有的单元格都是空的(如果我错了,请纠正我)。当我尝试将数据从第一张工作表复制到第二张工作表时,什么也没有发生:单元格没有填充

using (FileStream fs = new FileStream(@"C:\Users\MyDoc.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
}

在您的代码中,看起来您从未将更改写回文件。如果您在Excel中打开文件,但没有看到更改,这可以解释原因。我想你想做这样的事情:

// Read the file into a workbook
XSSFWorkbook templateWorkbook;
using (FileStream fs = new FileStream(@"C:\Temp\MyDoc.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:\Temp\MyDoc.xlsx", FileMode.Create, FileAccess.Write))
{
    templateWorkbook.Write(fs);
}
如果要复制整个工作表,则不需要逐个单元格进行复制。NPOI有一个
CopySheet
方法,您可以使用它:

sheettoget.CopySheet("Sheet2", true);

在您的代码中,看起来您从未将更改写回文件。如果您在Excel中打开文件,但没有看到更改,这可以解释原因。我想你想做这样的事情:

// Read the file into a workbook
XSSFWorkbook templateWorkbook;
using (FileStream fs = new FileStream(@"C:\Temp\MyDoc.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:\Temp\MyDoc.xlsx", FileMode.Create, FileAccess.Write))
{
    templateWorkbook.Write(fs);
}
如果要复制整个工作表,则不需要逐个单元格进行复制。NPOI有一个
CopySheet
方法,您可以使用它:

sheettoget.CopySheet("Sheet2", true);

嘿,我已经做了你建议的更改,但是第一张纸被完全删除了。有没有一种方法可以防止这种情况发生?嗯,当我使用上面的代码尝试时,不会发生这种情况。您确定没有意外覆盖Sheet1吗?CreateSheet(或CopySheet)的目标应该是“Sheet2”。操作时,我选中了,而不是在Sheet2中写入,而是在sheet1中写入。很抱歉非常感谢您的帮助:DHey,我已经做了您建议的更改,但是第一张纸被完全删除了。有没有一种方法可以防止这种情况发生?嗯,当我使用上面的代码尝试时,不会发生这种情况。您确定没有意外覆盖Sheet1吗?CreateSheet(或CopySheet)的目标应该是“Sheet2”。操作时,我选中了,而不是在Sheet2中写入,而是在sheet1中写入。很抱歉非常感谢你的帮助