吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 180|回复: 4
收起左侧

[经验求助] C# NPOI读取Excel已有文件

[复制链接]
夜雨闻笛 发表于 2024-3-5 00:35
25吾爱币
本帖最后由 夜雨闻笛 于 2024-3-5 00:38 编辑

搜索c#怎么读写excel的时候,在博客上复制了代码过来用,但这个代码只能新建一个Excel文件然后写入,却不能读取之后再将数据写入这个读取出来的文档中。


class 读写类
{
public static void 测试(string 文件名,其他形参………)
{
文件名 = “C:/Work/” + 文件名+ ".xlsx";
IWorkbook 工作簿 = new XSSFWorkbook();
ISheet 工作表 = 工作簿.CreateSheet("工作汇总")
IRow 行数据 = 工作表.CreateRow(0);


//
//这里写文件
for (int i = 0; i < 1000 i++)
{
   行数据.CreateCell(0).SetCellValue("xxxxxx")
   行数据.CreateCell(1).SetCellValue("xxxxxx")
   行数据.CreateCell(2).SetCellValue("xxxxxx")


   行数据 = 工作表.CreateRow(i + 1);
}
//


using FileStream fs = File.OpenWrite(文件名);
工作簿.Write(fs);
}
}


上面这段代码运行的很棒,速度快的很.
可问题是每次他都会重新创建新工作簿,然后在工作簿中新建工作表……
而我需要的是,我有一个已经建好的工作簿,当我每次需要向这个工作簿中写入数据的时候,我就读取这个工作簿,然后写入。
于是我尝试将这两句:
IWorkbook 工作簿 = new XSSFWorkbook();
ISheet 工作表 = 工作簿.CreateSheet("工作汇总")
改成这样:
IWorkbook 工作簿 = new XSSFWorkbook(文件名);//读取我指定的那个Excel文件
ISheet 工作表 = 工作簿.GetSheet("上报老板表");//获取我指定的那张表里


结果就开始花式报错
读取失败的有,什么IO错误的也有,还有什么DLL什么东西的一长串一行行的错误(警告MSB3026无法将xxx.dll复制到xxx.dll,1000 毫秒后将开始第N次重试),还有空引用(这个我弄了半小时弄明白了,大概是新建的工作簿不自带任何工作表sheet,所以当我在新得工作簿上不新建工作表而是直接读取工作表的时候就报错了)
最离谱的是还有锁定我文件的!
锁了之后不让我打开这个文件了,WPS提示我修复什么的.我把VS关掉,把WPS关掉,所有能看懂的两者相关进程都关掉,但文件还是锁定状态!  哭了 幸好WPS能恢复历史版本,否则明天大家就只能看到我的shi体了
总之从8点到现在,翻来覆去那几种错误把我弄晕了,又不懂多少英语,网上搜到的代码除了变量名我能认识,其他全是看不懂的英文,C#说明更都是天书了。
现在就想求大佬教我这个NPOI怎么读取已有Excel并写入,顺便看看这代码是不是有问题?为什么之前出现过锁定文件的情况。(是因为代码运行中途报错导致文件无法关闭吗?)
(如果有比这个NPOI更快的代码,也可以的,我之前有一段时间用XLWorkbook读写,但是读写起来有点卡顿延迟,也不知道哪里的问题,感觉效率不太行,最近才开始新抄的NPOI)


求大佬现身

最佳答案

查看完整内容

[mw_shl_code=csharp,true] string 文件路径 = "C:\%users\\Administrator\\Desktop\\111.xlsx"; FileStream 文件流 = new FileStream(文件路径, FileMode.Open, FileAccess.Read); XSSFWorkbook 工作簿 = new XSSFWorkbook(文件流); ISheet 工作表 = 工作簿.GetSheet("工作汇总"); for (int i = 0; i < 100; i++) { IRow 行数 ...

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

十万菠萝拍黄瓜 发表于 2024-3-5 00:35
夜雨闻笛 发表于 2024-3-5 16:52
大佬你好,代码已经用上不再报错。
只是我将CreateRow和CreateCell换成GetRow和GetCell后,还是会报错。 ...

[C#] 纯文本查看 复制代码
            string 文件路径 = "C:\\Users\\Administrator\\Desktop\\111.xlsx";
            FileStream 文件流 = new FileStream(文件路径, FileMode.Open, FileAccess.Read);
            XSSFWorkbook 工作簿 = new XSSFWorkbook(文件流);
            ISheet 工作表 = 工作簿.GetSheet("工作汇总");

            for (int i = 0; i < 100; i++)
            {
                IRow 行数据 = 工作表.GetRow(i);
                if (行数据 == null)
                {
                    行数据 = 工作表.CreateRow(i);
                }
                行数据.GetCell(0, MissingCellPolicy.CREATE_NULL_AS_BLANK).SetCellValue("888");
                行数据.GetCell(1, MissingCellPolicy.CREATE_NULL_AS_BLANK).SetCellValue("999");
                行数据.GetCell(2, MissingCellPolicy.CREATE_NULL_AS_BLANK).SetCellValue("000");
            }

            文件流.Close();
            FileStream 输出文件流 = new FileStream(文件路径, FileMode.Create, FileAccess.Write);
            工作簿.Write(输出文件流);
            输出文件流.Close();
            工作簿.Close();
            Console.WriteLine("ok");
            Console.ReadLine();
十万菠萝拍黄瓜 发表于 2024-3-5 10:27
[C#] 纯文本查看 复制代码
string 文件路径 = "C:\\Users\\Administrator\\Desktop\\111.xlsx";
            FileStream 文件流 = new FileStream(文件路径, FileMode.Open, FileAccess.Read);
            XSSFWorkbook 工作簿 = new XSSFWorkbook(文件流);
            ISheet 工作表 = 工作簿.CreateSheet("工作汇总");
            IRow 行数据 = 工作表.CreateRow(0);
            for (int i = 0; i < 100; i++) {
                行数据.CreateCell(0).SetCellValue("111");
                行数据.CreateCell(1).SetCellValue("222");
                行数据.CreateCell(2).SetCellValue("333");

                行数据 = 工作表.CreateRow(i + 1);
            }
            文件流.Close();
            FileStream 输出文件流 = new FileStream(文件路径, FileMode.Create, FileAccess.Write);
            工作簿.Write(输出文件流);
            输出文件流.Close(); 
            工作簿.Close();
 楼主| 夜雨闻笛 发表于 2024-3-5 16:52
十万菠萝拍黄瓜 发表于 2024-3-5 10:27
[mw_shl_code=csharp,true]string 文件路径 = "C:\%users\\Administrator\\Desktop\\111.xlsx";
          ...

大佬你好,代码已经用上不再报错。
只是我将CreateRow和CreateCell换成GetRow和GetCell后,还是会报错。
我研究了一下,应该是读取空行或者空格子的时候返回了null导致错误。
而我比较想用Get而不是Create,因为Create是创建新行新列,这会使我设定好的工作表格式无效。
所以还是想厚着脸皮再额外请教大佬一下,有什么办法解决这个空格子的问题吗?(我的表都是设定好格式的表,只是里面没内容,这些没内容的行和格子,怎么样才能不报错的获取它们然后在它们身上写入数据)。
 楼主| 夜雨闻笛 发表于 2024-3-5 19:29
十万菠萝拍黄瓜 发表于 2024-3-5 18:23
[mw_shl_code=csharp,true]            string 文件路径 = "C:\%users\\Administrator\\Desktop\\111.xls ...

大佬威武!
完美解决!
新年快乐!
天天发财!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-22 06:55

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表