C#NPOI循环打开文件夹里的表格出错。

我的工作需要按日期保存表格,再根据做报告的时间段,来汇总整理对应的数据。学习写了一段代码,在打开文件时就出错了(错误提示:InvalidFormatException: 已存在具有相同键的条目)。拜托高手指点一下。代码如下:


static void Main(string[] args)
        {
            string filesPath = @"D:\C#\基础数据";
            int wj = 0;
            string[] files = Directory.GetFiles(filesPath, "*.*", SearchOption.AllDirectories);
            foreach (string file in files) // 统计文件个数
            {
                wj++;
            }
            Console.WriteLine("共有"+ wj +"个表格");

            for (int i = 1; i <= 5; i++)  //如果只执行2次,就不会报错;要多读几个就报错了;
            {
                FileStream fileStream = new FileStream(files[wj - i], FileMode.Open, FileAccess.Read); //需要从最近日期的表格开始读
                IWorkbook wb_ls = new XSSFWorkbook(fileStream);
                ISheet sh_ls = wb_ls.GetSheetAt(0);//只有1个表单

                Console.WriteLine(sh_ls.GetRow(1).GetCell(10).StringCellValue);//测试读取一个单元格的值
                
                wb_ls.Close();
                fileStream.Close();
                fileStream.Dispose();
                Thread.Sleep(2000);
            }

没遇到你说的这个问题过,试试这种写法康康


var filesPath = AppDomain.CurrentDomain.BaseDirectory + @"Log\";
            //可以同时读出xls,xlsx两种文件
            var files = System.IO.Directory.GetFiles(filesPath, "*.xls", SearchOption.AllDirectories);
            Console.WriteLine("共有" + files.Length + "个表格");

            var IEFileList = files.Select(t => new 
            {
                //最后修改时间
                LastTime = System.IO.File.GetLastWriteTime(t),
                //后缀是否为xls
                IsXls = System.IO.Path.GetExtension(t).Equals(".xls", StringComparison.CurrentCultureIgnoreCase),
                path = t,
            }).
            OrderByDescending(t=>t.LastTime);
            foreach (var item in IEFileList)
            {
                IWorkbook workbook = null;
                if (item.IsXls)
                {
                    workbook = new NPOI.HSSF.UserModel.HSSFWorkbook(new FileStream(path, FileMode.Open));
                }
                else
                {
                    workbook = new NPOI.XSSF.UserModel.XSSFWorkbook(path);
                }
                ISheet sh_ls = workbook.GetSheetAt(0);
                //剩下的逻辑
            }

【以下回答由 GPT 生成】

这个错误是由于在循环中多次打开同一个文件导致的。解决该问题的一个方法是将文件的打开和关闭操作放在循环外面,并在每次循环中复制一份文件,然后对复制的文件进行操作。具体的解决方案如下:

static void Main(string[] args)
{
    string filesPath = @"D:\C#\基础数据\";
    int wj = 0;
    string[] files = Directory.GetFiles(filesPath, "*.*", SearchOption.AllDirectories);

    foreach (string file in files) // 统计文件个数
    {
        wj++;
    }
    Console.WriteLine("共有" + wj + "个表格");

    string lastFilePath = files[wj - 1];
    for (int i = 1; i <= 5; i++) 
    {

        string tempFilePath = Path.GetTempFileName(); // 创建临时文件,用于保存对原始文件的操作
        File.Copy(lastFilePath, tempFilePath, true); // 复制原始文件到临时文件

        FileStream fileStream = new FileStream(tempFilePath, FileMode.Open, FileAccess.Read); 
        IWorkbook wb_ls = new XSSFWorkbook(fileStream);
        ISheet sh_ls = wb_ls.GetSheetAt(0); 

        Console.WriteLine(sh_ls.GetRow(1).GetCell(10).StringCellValue); 

        wb_ls.Close();
        fileStream.Close();
        fileStream.Dispose();
        Thread.Sleep(2000);
    }
}

以上代码中的主要改动为: 1. 在循环外面创建一个临时文件,并将最新的文件复制到临时文件中。 2. 在每次循环中使用临时文件进行操作,这样就不会出现打开同一个文件多次的错误了。

请尝试运行此优化后的代码,看看是否能够解决问题。希望对你有帮助!如果还有其他问题,请随时提问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^