C# 如何在C中使用NPOI从excel文件中正确检索字符串#
我是一名实习生,现在正在用C#编程,我必须从excel文件中检索字符串。此excel实际上是从两台不同的机器(如下所示,示例1对应于名为“thermo”的机器,另一个示例对应于名为“Agilent”的机器)进行化学分析后收集的结果 此Excel是一个空Excel文件,用户可以在其中复制和粘贴数据,并按一些按钮进行处理。其中一个事实是,当您按下按钮时,列A中的所有项目都将放在单元格B2中,以分号分隔,就像列表一样 在单元格B2中检索此字符串后,我应该在另一个方法中返回它,该方法应该使用正则表达式将此字符串拆分为两个列表(示例和引用)。我的问题是,我不知道我的初始字符串是否从第一个方法正确返回,因为当我运行代码时,它工作不正常,字符串被正确拆分,但元素比预期的多 这是我的密码:C# 如何在C中使用NPOI从excel文件中正确检索字符串#,c#,excel,regex,parsing,C#,Excel,Regex,Parsing,我是一名实习生,现在正在用C#编程,我必须从excel文件中检索字符串。此excel实际上是从两台不同的机器(如下所示,示例1对应于名为“thermo”的机器,另一个示例对应于名为“Agilent”的机器)进行化学分析后收集的结果 此Excel是一个空Excel文件,用户可以在其中复制和粘贴数据,并按一些按钮进行处理。其中一个事实是,当您按下按钮时,列A中的所有项目都将放在单元格B2中,以分号分隔,就像列表一样 在单元格B2中检索此字符串后,我应该在另一个方法中返回它,该方法应该使用正则表达式将
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
namespace excel
{
class Class1
{
public static string ReadExcel()
{
string filepath = @"C:\Users\Lionel84100\Desktop\Excel\fezfFzfe.xlsx";
try
{
IWorkbook workbook = null;
FileStream fs = new FileStream(filepath, FileMode.Open, FileAccess.Read);
if (filepath.IndexOf(".xlsx") > 0)
{
workbook = new XSSFWorkbook(fs);
}
else if (filepath.IndexOf(".xls") > 0)
{
workbook = new HSSFWorkbook(fs);
}
ISheet sheet = workbook.GetSheet("Formatage_IM");
if (sheet != null)
{
int rowCount = sheet.LastRowNum;
for (int i = 1; i <= rowCount; i++)
{
IRow curRow = sheet.GetRow(i);
string cellValue1 = curRow.GetCell(1).StringCellValue;
return cellValue1;
}
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
return "";
}
public static (List<string> sample, List<string> reference) parse()
{
string input = ReadExcel();
Regex regex = new Regex(@"^(\s*;\s*)+|(\s*;\s*)+$");
string output = regex.Replace(input, " ");
List<string> sample = new List<string>();
List<string> reference = new List<string>();
string pattern = @"C-[0-9]{6}-S-[0-9]{3}( [0-9])?";
Regex rgx = new Regex(pattern);
foreach (string term in output.Split(';').Select(s => s.Trim()).Where(s => !string.IsNullOrEmpty(s)))
{
if (rgx.IsMatch(term))
{
sample.Add(term);
}
else
{
reference.Add(term);
reference.ForEach(Console.WriteLine);
}
}
return (sample, reference);
}
}
}
使用NPOI.SS.UserModel;
使用NPOI.XSSF.UserModel;
使用制度;
使用System.Collections.Generic;
使用System.IO;
使用System.Linq;
使用系统文本;
使用System.Text.RegularExpressions;
名称空间excel
{
一班
{
公共静态字符串ReadExcel()
{
字符串文件路径=@“C:\Users\Lionel84100\Desktop\Excel\fezfzfe.xlsx”;
尝试
{
IWorkbook工作簿=空;
FileStream fs=newfilestream(filepath,FileMode.Open,FileAccess.Read);
if(filepath.IndexOf(“.xlsx”)>0)
{
工作簿=新XSSF工作簿(fs);
}
else if(filepath.IndexOf(“.xls”)>0)
{
工作簿=新的HSSF工作簿(fs);
}
ISHET sheet=workbook.GetSheet(“Formatage_IM”);
如果(工作表!=null)
{
int rowCount=sheet.LastRowNum;
对于(int i=1;i s.Trim())。其中(s=>!string.IsNullOrEmpty(s)))
{
if(rgx.IsMatch(期限))
{
样品。添加(术语);
}
其他的
{
参考。添加(术语);
reference.ForEach(Console.WriteLine);
}
}
退货(样品、参考);
}
}
}
我主要只调用第二种方法
字符串示例:
示例1:“QC4 1000 ppm;C-191108-S-0095;C-191108-S-0095;QC4 100 ppm;QC4 1000 ppm;Et 500 ppm;Et 1000 ppm;Et 2000 ppm;”
示例2:“C-210104-S-117 2;C-210104-S-118 1;C-210104-S-118 2;参考100ppm QC4;参考1000ppm QC4;”
“我的控制台”中的错误元素比预期的多:
预期结果:
示例1/列表样本:C-191108-S-0095;C-191108-S-0095;(与样本名称相对应)
示例1/列表参考:QC4 1000 ppm;QC4 100 ppm;QC4 1000 ppm;Et 500 ppm;Et 1000 ppm;Et 2000 ppm;“(这对应于作为参考值的参考名称,用于在化学分析后比较结果)
示例2/列表示例:C-210104-S-117 2;C-210104-S-118 1;C-210104-S-118 2
示例2/列表参考:参考100ppm QC4;参考1000ppm QC4
请问我的代码哪里有错误
谢谢您的理解。Excel没有列表类型。我怀疑Excel文件是通过使用不兼容的区域性设置(在大多数欧洲国家,列表分隔符是
;
,而不是,
)惰性地双击CSV创建的并保存为Excel,而没有意识到整行都在一个单元格中。真正的解决方案是修复生成此Excel文件的代码,或者告诉执行此操作的人员使用正确设置从数据
菜单导入文件。您想做什么?读取数据?将其转换为CSV?或正确的Excel文件?如果您想返回原始CSV,您可以读取整个第一列并将每个值写入一个文件。如果您想读取该数据,您可以将其附加到StringBuilder,然后使用eg CsvHelper读取CSV字符串。PS:我现在也有同样的问题。懒惰的合作伙伴向我们发送“Excel”“将整行内容放在第一个单元格中的文件。当业务人员试图说服合作伙伴认真对待时,我只需将单元格值附加到文件中,即可将单元格值导出到CSV文件。你说的“使用不兼容的区域性设置懒散地双击CSV”是什么意思(在大多数欧洲国家,列表分隔符是;,而不是,)并保存为Excel,但没有意识到整行都在一个单元格中。”?我不明白。我该如何做到这一点“使用正确设置从数据菜单导入文件”?我怀疑Excel与此问题无关,即使您将数据保存到CSV中,您仍然会遇到问题。真正的问题是如何解析QC4 1000 ppm;C-191108-S-0095;C-191108-S-0095;QC4 100 ppm;QC4 1000 ppm;Et 500 ppm;Et 1000 ppm;Et 2000 ppm;
?这与Excel无关。您将拥有相同的pr文本文件的问题(这里可能更可取)。解析规则是什么?两个示例的预期结果是什么?