【问题标题】:C# NPOI library : xlsx file is not updated after modificationC# NPOI 库:修改后不更新 xlsx 文件
【发布时间】:2016-07-20 03:21:21
【问题描述】:

所以我有以下代码,我正在尝试修改 Excel 工作表。在4th 行,我正在添加带有test 作为字符串的其他单元格,但我的文件没有更新。我阅读了很多关于NPOI 库的文章,发现很少有版本不支持编写xlsx 文件。但我想我正在使用2.2.1,它应该这样做。请帮帮我。

enter code here

using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.IO;
using Excel;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
namespace PantheonProject
{
    public class test
    {
        public static void testMethod()
        {
            XSSFWorkbook hssfwb;
            using (FileStream file = new FileStream(@"/Users/harshloomba/Documents/workspace/PantheonProject/source.xlsx", FileMode.Open, FileAccess.Read))
            {
                hssfwb = new XSSFWorkbook(file);
                file.Close();
            }

            ISheet sheet = hssfwb.GetSheetAt(0);
            IRow row = sheet.GetRow(4);

            //sheet.CreateRow(row.LastCellNum);
            ICell cell = row.CreateCell(row.LastCellNum);
            cell.SetCellValue("test");

            for (int i = 0; i < row.LastCellNum; i++)
            {
                Console.WriteLine(row.GetCell(i));
            }

            using (FileStream file = new FileStream(@"/Users/harshloomba/Documents/workspace/PantheonProject/source.xlsx", FileMode.Open, FileAccess.Write))
            {
                hssfwb.Write(file);
                file.Close();
            }
        }
    }
}

【问题讨论】:

    标签: c# excel npoi


    【解决方案1】:

    也许您正在尝试运行代码from this answer。在您的代码中:

    1. 您正尝试使用FileMode.Open 模式写入文件。将其更改为 FileMode.OpenOrCreateFileMode.CreateNew
    2. 如果您修改/编辑输入文件(在您的情况下为source.xlsx),文件将被损坏,这可能是NPOI 的错误。为输出文件指定一个不同的名称(例如->source2.xlsx)。

    试试下面的代码。它对我有用。

    public static void testMethod()
    {
        XSSFWorkbook hssfwb;
        using (FileStream file = new FileStream(@"/Users/harshloomba/Documents/workspace/PantheonProject/source.xlsx", FileMode.Open, FileAccess.Read))
        {
            hssfwb = new XSSFWorkbook(file);
            file.Close();
        }
    
        ISheet sheet = hssfwb.GetSheetAt(0);
        IRow row = sheet.GetRow(4);
    
        //sheet.CreateRow(row.LastCellNum);
        ICell cell = row.CreateCell(row.LastCellNum);
        cell.SetCellValue("test");
    
        for (int i = 0; i < row.LastCellNum; i++)
        {
            Console.WriteLine(row.GetCell(i));
        }
    
        using (FileStream file = new FileStream(@"/Users/harshloomba/Documents/workspace/PantheonProject/source2.xlsx", FileMode.OpenOrCreate, FileAccess.Write))
        {
            hssfwb.Write(file);
            file.Close();
        }
    }
    

    解决方案 2

    如果您不想更改文件名,请删除输入文件并创建一个具有相同文件名的新文件。

    public static void testMethod()
    {
        XSSFWorkbook hssfwb;
        using (FileStream file = new FileStream(@"/Users/harshloomba/Documents/workspace/PantheonProject/source.xlsx", FileMode.Open, FileAccess.Read))
        {
            hssfwb = new XSSFWorkbook(file);
            file.Close();
        }
    
        ISheet sheet = hssfwb.GetSheetAt(0);
        IRow row = sheet.GetRow(4);
    
        //sheet.CreateRow(row.LastCellNum);
        ICell cell = row.CreateCell(row.LastCellNum);
        cell.SetCellValue("test");
    
        for (int i = 0; i < row.LastCellNum; i++)
        {
            Console.WriteLine(row.GetCell(i));
        }
    
        File.Delete(@"/Users/harshloomba/Documents/workspace/PantheonProject/source.xlsx");
    
        using (FileStream file = new FileStream(@"/Users/harshloomba/Documents/workspace/PantheonProject/source.xlsx", FileMode.OpenOrCreate, FileAccess.Write))
        {
            hssfwb.Write(file);
            file.Close();
        }
    }
    

    解决方案 3:当您不想删除并重新创建文件时(类似解决方案 2

    在这种情况下,您应该使用NPOI 创建文件,而不是手动创建 excel 文件(见下图)。

    如果您使用 NPOI 创建 excel 文件,您可以编辑/修改相同的文件。这一次它不会被破坏。为了正确使用以下代码,我假设您已经创建了 source.xlsxNPOI

    public static void testMethod()
        {
            XSSFWorkbook hssfwb;
            using (FileStream file = new FileStream(@"/Users/harshloomba/Documents/workspace/PantheonProject/source.xlsx", FileMode.Open, FileAccess.Read))
            {
                hssfwb = new XSSFWorkbook(file);
                file.Close();
            }
    
            ISheet sheet = hssfwb.GetSheetAt(0);
            IRow row = sheet.GetRow(4);
    
            //sheet.CreateRow(row.LastCellNum);
            ICell cell = row.CreateCell(row.LastCellNum);
            cell.SetCellValue("test");
    
            for (int i = 0; i < row.LastCellNum; i++)
            {
                Console.WriteLine(row.GetCell(i));
            }
    
    
            using (FileStream file = new FileStream(@"/Users/harshloomba/Documents/workspace/PantheonProject/source.xlsx", FileMode.OpenOrCreate, FileAccess.Write))
            {
                hssfwb.Write(file);
                file.Close();
            }
        }
    

    【讨论】:

      【解决方案2】:

      我已经修改了建议的内容,但什么也没发生,然后我使用 IKVM.net 将 Apache poi 移植到 Xamarin 工作室,它工作得非常好。你也可以试试

      【讨论】:

        【解决方案3】:

        我能够通过简单地调用带有 null 参数的 Write() 方法来克服写入辅助文件的问题。

        IWorkbook myWorkbook = new XSSFWorkbook(@"c:\temp\Report.xlsx");
        ISheet mySheet = myWorkbook.GetSheet("SheetName");
        
        //...
        //modify mySheet as needed
        //...
        
        myWorkbook.Write(null);
        myWorkbook.Close();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-11-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多