Выполнить поиск и замену в документе Excel на C#

#c# #asp.net #xml #excel #openxml

#c# #asp.net #xml #excel #openxml

Вопрос:

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

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

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

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

Ответ №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 и т.д.

Комментарии:

1. Спасибо за ваш ответ — на самом деле мне не нужно создавать ярлыки в массовом порядке — каждый клиент просто распечатает нужный ему ярлык, но я все равно посмотрю на ссылку

2. А, понятно. Итак, это программа, которая создаст файл, который клиенты будут использовать для печати своих этикеток? Другим вариантом может быть использование программы PDF writer. Это, вероятно, даст вам лучший контроль над выводом и не потребует от ваших клиентов установки Excel.

3. Спасибо за ваш совет StriplingWarrior. Я заметил, что приложение уже использовало PDFsharp, поэтому я отказался от Excel / XML и просто нарисовал ярлык прямо в PDF. Работа выполнена — результат тоже намного лучше!

Ответ №2:

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

Ответ №3:

Расширение сценария Powershell PSExcel имеет функцию поиска и замены:

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

 Import-Module d:psexceltrunkPSExcelPSExcel

# 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:tmpSource" -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
 }