Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在C中使用NPOI从excel文件中正确检索字符串#_C#_Excel_Regex_Parsing - Fatal编程技术网

C# 如何在C中使用NPOI从excel文件中正确检索字符串#

C# 如何在C中使用NPOI从excel文件中正确检索字符串#,c#,excel,regex,parsing,C#,Excel,Regex,Parsing,我是一名实习生,现在正在用C#编程,我必须从excel文件中检索字符串。此excel实际上是从两台不同的机器(如下所示,示例1对应于名为“thermo”的机器,另一个示例对应于名为“Agilent”的机器)进行化学分析后收集的结果 此Excel是一个空Excel文件,用户可以在其中复制和粘贴数据,并按一些按钮进行处理。其中一个事实是,当您按下按钮时,列A中的所有项目都将放在单元格B2中,以分号分隔,就像列表一样 在单元格B2中检索此字符串后,我应该在另一个方法中返回它,该方法应该使用正则表达式将

我是一名实习生,现在正在用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文本文件的问题(这里可能更可取)。解析规则是什么?两个示例的预期结果是什么?