我的工作需要按日期保存表格,再根据做报告的时间段,来汇总整理对应的数据。学习写了一段代码,在打开文件时就出错了(错误提示: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. 在每次循环中使用临时文件进行操作,这样就不会出现打开同一个文件多次的错误了。
请尝试运行此优化后的代码,看看是否能够解决问题。希望对你有帮助!如果还有其他问题,请随时提问。