2011-04-26 80 views
2

我正在尝试创建一个在C#中动态填充的邮资标签。在Excel中执行查找和替换Excel文档#

我想我唯一能做的就是在Excel中创建标签,以便我能得到完美的布局,然后使用OpenXML的更换等领域。即我有字段叫XXAddressLine1XX,我想编辑XML并用数据库中的实际Address Line 1替换那些文本。

有没有人究竟做了类似的措施前,可以张贴一些代码了,我可以试试吗?我之前使用过OpenXML来处理Word文档,但是我似乎无法在c#中使用OpenXML时找到Excel文档的XML数据,所以我正在努力取得进展。

要么,或者有没有更好的方法,我可以尝试做到这一点?

回答

1

然后每一个现在,有一个程序问题最好用非编程解决方案来解决。企业需要长时间打印邮件标签集成,近几十年来,像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数据库等

+0

谢谢 - 我实际上并不需要集体创建标签 - 每个客户只想打印他们需要的标签,但我会看看链接 – 2011-04-26 16:14:26

+0

啊,我明白了。所以这是一个程序,将创建一个文件供客户用来打印他们的标签?另一种选择可能是使用PDF书写器。这可能会让您更好地控制输出,并且不会要求您的客户安装Excel。 – StriplingWarrior 2011-04-26 17:12:25

+1

感谢您的建议StriplingWarrior。我注意到应用程序已经使用过PDFSharp,所以我放弃了Excel/XML的东西,只是将标签直接绘制成PDF。工作完成 - 一个更好的结果呢! – 2011-04-27 17:08:52

1

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

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 
}