Free Support Forum - aspose.com

Aspose.Cells 函数Cells.Find()是否支持正则表达式?

@Peyton.Xu aspose.cell 中Worksheets[].Cells.Find()是否支持正则表达式(Regular Expression),我在C#里试了好多次都没成功,我在查找B列查找“3A”或“SD"开头的数字+英文字母混合的值,长度为12个字符,不知道有没有这功能,谢谢。

@sweetime,
Aspose.Cells支持使用正则表达式搜索文本。 您可以尝试以下示例代码,如果发现某些问题,请共享示例Excel文件和可运行的控制台应用程序以进行测试。 我们将在此处重现该场景并相应地分享我们的反馈。

string regEx = @"abc-*xyz";
Workbook workbook = new Workbook("Book1.xlsx");
Worksheet worksheet = workbook.Worksheets[0];

FindOptions options = new FindOptions();
options.RegexKey = true;
options.LookInType = LookInType.Values;
options.LookAtType = LookAtType.Contains;

Cell found = null;
do
{
    found = worksheet.Cells.Find(regEx, found, options);
    if(found != null)
        Console.WriteLine(found.Value);
} while (found != null);

原来是少了options.RegexKey = true;,搞定,谢谢。

@sweetime,

很高兴知道建议的代码段可以满足您的需求。 如有其他疑问或问题,请随时给我们回信。

又遇到新问题了,还得再麻烦您。

如附件,有 ”清单.xlsx“(简称源文件)和”报价.xlsx“(简称目标文件)两个文件,
源文件工作表为”分部分项工程量清单“,目标文件工作表为”分部分项工程量清单计价表“,
我要实现的功能是把源文件的“项目特征”按编码一一对应的方式复制到目标文件中的“项目特征”列中。
我的想法是这样:先搜索源文件中的编码,找到后用搜索结果搜索目标文件的编码,
可以得到相同编码在源文件和目标文件中的行号,之后就可以完成上述的功能。
但由于两工作表中的”编码“的排序并不一致(实际中这两表比例复杂,无法先进行排序再操作),一遇到不一致的情况就返回null,按我的想法,不应出现这样的情况,麻烦帮我看看怎么解决或者有更好的实现方法,谢谢。

            Workbook wb = new Workbook(“报价.xlsx");
            Worksheet ws = wb.Worksheets["分部分项工程量清单计价表"];
            Workbook qd_wb = new Workbook(“清单.xlsx");
            Worksheet qd_ws = qd_wb.Worksheets["分部分项工程量清单"];
   FindOptions opts = new FindOptions();
        opts.RegexKey = true; 
        opts.LookInType = LookInType.Values;
        opts.LookAtType = LookAtType.Contains;
        CellArea cellarea = new CellArea();
             cellarea.StartRow = 1;
            cellarea.EndRow = ws.Cells.MaxDataRow+1;
            cellarea.StartColumn = 1;
            cellarea.EndColumn = 1;
            opts.SetRange(cellarea);
        Aspose.Cells.Cell found = null;
      Aspose.Cells.Cell qd_found = null;

do
{
qd_found =qd_ws.Cells.Find(new Regex(@"^((3A)|(SD))[A-Za-z0-9]{10}$"), qd_found, opts);
found = ws.Cells.Find(qd_found.Value, found, opts);
ws.Cells[found.Row, found.Column + 2].PutValue(qd_ws.Cells[qd_found.Row, qd_found.Column + 2].StringValue);
} while (found != null&& qd_found != null);

测试文件.zip (22.7 KB)

@sweetime

既然两工作表中的“编码”的排序并不一致,必须每次从头开始重新查询:

Workbook wb = new Workbook("报价.xlsx");
Worksheet ws = wb.Worksheets["分部分项工程量清单计价表"];
Workbook qd_wb = new Workbook("清单.xlsx");
Worksheet qd_ws = qd_wb.Worksheets["分部分项工程量清单"];

FindOptions qd_opts = new FindOptions();
qd_opts.RegexKey = true;
qd_opts.LookInType = LookInType.Values;
qd_opts.LookAtType = LookAtType.Contains;
CellArea qd_cellarea = new CellArea();
qd_cellarea.StartRow = 1;
qd_cellarea.EndRow = qd_ws.Cells.MaxDataRow + 1;
qd_cellarea.StartColumn = 1;
qd_cellarea.EndColumn = 1;
qd_opts.SetRange(qd_cellarea);


FindOptions opts = new FindOptions();
opts.RegexKey = false;
opts.LookInType = LookInType.Values;
opts.LookAtType = LookAtType.Contains;
CellArea cellarea = new CellArea();
cellarea.StartRow = 1;
cellarea.EndRow = ws.Cells.MaxDataRow + 1;
cellarea.StartColumn = 1;
cellarea.EndColumn = 1;
opts.SetRange(cellarea);

Aspose.Cells.Cell qd_found = null;
do
{
    qd_found = qd_ws.Cells.Find(@"^((3A)|(SD))[A-Za-z0-9]{10}$", qd_found, qd_opts);
    if(qd_found != null)
    {
        //既然两工作表中的“编码”的排序并不一致,必须每次从头开始重新查询
        Aspose.Cells.Cell found = null;
        found = ws.Cells.Find(qd_found.Value, found, opts);
        if (found != null)
        {
            ws.Cells[found.Row, found.Column + 2].PutValue(qd_ws.Cells[qd_found.Row, qd_found.Column + 2].StringValue);
        }
        else
        {
            //log something
        }
    }

} while (qd_found != null);

wb.Save("Output.xlsx"); 

其实,你还可以先遍历“清单.xlsx“,把编码和对应的项目特征放在map<编码,项目特征>里,然后遍历“报价”.xlsx“,根据编码在上述map里查询。

豁然开朗,已用Dictionary来实现,多谢。

@sweetime,
很高兴知道您的问题已经解决。 如果您需要进一步的帮助或有其他问题或疑问,请随时与我们联系,我们将竭诚为您服务。