Выполните поиск и замену в Excel документ в C # - PullRequest
2 голосов
/ 26 апреля 2011

Я пытаюсь создать почтовую метку, которая динамически заполняется в C #.

Я подумал, что мог бы создать метку в Excel, чтобы я мог получить идеальный макет, а затем использовать OpenXML для заменыполя.т. е. у меня есть поля с именами типа XXAddressLine1XX, где я хочу отредактировать XML и заменить этот текст фактическим Address Line 1 из базы данных.

Кто-нибудь на самом деле делал что-то похожее на это раньше и мог публиковатькакой-нибудь код, чтобы я мог попробовать?Я использовал OpenXML, чтобы сделать это с текстовыми документами раньше, но я не могу найти данные XML для документа Excel при использовании OpenXML в c #, поэтому я пытаюсь добиться прогресса.

Или это, или есть какие-нибудь лучшие методы, которые я мог бы попытаться достигнуть этого?

Ответы [ 3 ]

1 голос
/ 04 мая 2011

Чисто академический ответ: это возможно. Я написал набор классов для анализа шаблонов, которые выполняют поиск в презентации PowerPoint, заменив теги на языке разметки, который я изобрел, диаграммами и динамическими текстовыми объектами, извлеченными из базы данных. Самая хитрая часть бита замены строки заключалась в обработке тегов, которые встречались в элементах Run внутри элемента Paragraph. Обычно это происходит, если вы используете специальные символы, такие как «{» или пробелы в своих тегах. Я смог решить эту проблему, сохранив текст всего элемента TextBody в гигантском массиве символов (в вашем случае это будет содержимое элемента Cell), сохранив список экстентов, перечисляющих, где находится символ Каждый элемент массива Run начинался и заканчивался, а затем проходил массив символов, обращая внимание на границы Run. Помните, что если ваш тег охватывает несколько элементов Run, вам нужно будет удалить все лишние элементы и перерезать контент через границы, прежде чем вставить замену Run. К сожалению, я не могу опубликовать какой-либо код, потому что работа была сделана для компании, но это общая идея, как этого добиться. Я не смог обработать ни одного случая новой строки (т. Е. Тег встречается с новой строкой в ​​нем), потому что для этого потребовалось бы написать перекрестный индексатор Paragraph, что выходило за рамки того, чего я хотел достичь. Это тоже можно сделать, но я думаю, это будет значительно сложнее.

1 голос
/ 26 апреля 2011

Время от времени возникает проблема программирования, которая лучше всего решается с помощью решения, не связанного с программированием.Компании давно нуждались в печати почтовых этикеток в массовом порядке , а в последние десятилетия такие программы, как 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 голосов
/ 01 февраля 2017

Расширение сценария 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
 }
...