簡體   English   中英

C# NPOI 庫:修改后不更新 xlsx 文件

[英]C# NPOI library : xlsx file is not updated after modification

所以我有以下代碼,我正在嘗試修改 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();
            }
        }
    }
}

也許您正在嘗試從這個答案運行代碼。 在您的代碼中:

  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 文件,您可以編輯/修改相同的文件。 這一次它不會被破壞。 為了正確使用以下代碼,我假設您已經使用NPOI創建了source.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/source.xlsx", FileMode.OpenOrCreate, FileAccess.Write))
        {
            hssfwb.Write(file);
            file.Close();
        }
    }

我已經修改了建議的內容,但什么也沒發生,然后我使用 IKVM.net 將 Apache poi 移植到 Xamarin Studio 中,它工作得非常好。 你也可以試試

通過簡單地調用帶有空參數的 Write() 方法,我能夠克服寫入輔助文件的問題。

IWorkbook myWorkbook = new XSSFWorkbook(@"c:\temp\Report.xlsx");
ISheet mySheet = myWorkbook.GetSheet("SheetName");

//...
//modify mySheet as needed
//...

myWorkbook.Write(null);
myWorkbook.Close();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM