#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
}