@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;,搞定,谢谢。
又遇到新问题了,还得再麻烦您。
如附件,有 ”清单.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)
既然两工作表中的“编码”的排序并不一致,必须每次从头开始重新查询:
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来实现,多谢。