执行查找&在C#中的excel doc中替换

时间:2011-04-26 15:31:07

标签: c# asp.net xml excel openxml

我正在尝试创建一个用C#动态填充的邮资标签。

我认为我可以做的是在Excel中创建标签,这样我就可以完美地进行布局,然后使用OpenXML替换字段。即我有称为XXAddressLine1XX之类的字段,我想编辑XML并将该文本替换为数据库中的实际Address Line 1

之前有没有人真的做过类似的事情并且可以发布一些我可以尝试的代码?我之前使用OpenXML用word文档来做这件事,但是当我在c#中使用OpenXML时,我似乎无法找到Excel文档的XML数据,因此我很难取得进展。

要不然,还是有更好的方法可以尝试实现这个目标?

3 个答案:

答案 0 :(得分:1)

每隔一段时间,编程问题最好通过非编程解决方案解决。企业已经需要长时间打印邮件标签 en masse ,近几十年来,像Microsoft Word这样的程序通过“邮件合并”功能使这一点变得非常简单。有关示例,请参阅http://office.microsoft.com/en-us/word-help/demo-use-mail-merge-to-format-and-print-mailing-labels-HA001190394.aspx

Word的邮件合并将允许您连接到各种数据源。给出的示例使用Excel电子表格,但您也可以使用Access或SQL数据库等

答案 1 :(得分:1)

纯粹的学术答案是:它是可能的。我编写了一组模板解析类,用于搜索PowerPoint演示文稿,用我用图表和从数据库中提取的动态文本对象发明的标记语言替换标记。字符串替换位中最棘手的部分是处理Run元素内Paragraph个元素之间发生的标记。如果您在标签中使用“{”或空格等特殊字符,通常会发生这种情况。我能够通过将整个TextBody元素的文本存储在一个巨大的字符数组中来解决它(在你的情况下它将是Cell元素的内容),存储枚举的范围列表在每个Run元素的字符数组中开始和结束的位置,然后在适当注意Run边界的同时遍历字符数组。请注意,如果您的代码跨越多个Run元素,则在插入替换Run之前,您需要删除任何额外内容并跨越边界剪切内容。不幸的是,我不能发布任何代码,因为工作是为一家公司完成的,但这是如何实现它的总体思路。我无法处理任何换行情况(即标签出现了换行符),因为这需要编写一个交叉Paragraph索引器,这超出了我想要实现的范围。这也可以做到,但我认为这将更加困难。

答案 2 :(得分:0)

Powershell脚本扩展PSExcel具有搜索和替换功能:

PSExcel: https://github.com/RamblingCookieMonster/PSExcel

Import-Module d:\psexcel\trunk\PSExcel\PSExcel

# Get commands in the module
Get-Command -Module PSExcel

# Get help for a command
Get-Help Import-XLSX -Full

 # Modify the path of the Excel file to your local svn ceck-out
 Get-ChildItem "C:\tmp\Source" -Filter *.xlsx | Foreach-Object{
    $fileName = $_.FullName

    # Open an existing XLSX to search and set cells within
    $Excel = New-Excel -Path $_.FullName

    $Workbook = $Excel | Get-Workbook

    #$Excel | Get-Worksheet
    $Worksheet = $Workbook | Get-Worksheet -Name "Sheet1"


    #Search for any cells like 'Chris'.  Set them all to Chris2
    $Worksheet | Search-CellValue {$_ -like 'Chris'} -As Passthru | Set-CellValue -Value "Chris2"

    #Save your changes and close the ExcelPackage
    $Excel | Save-Excel -Close
 }