2011-04-26 73 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 
}