Я создаю приложение, которое может обрабатывать файлы ввода excel и сохранять их как новый файл, после чего их нужно преобразовать в pdf. Наконец, они прикреплены к электронному письму и отправляются. Проблема, с которой я сталкиваюсь, заключается в том, что PDF-код не преобразован должным образом. В итоге я получаю 2 страницы, каждая из которых содержит вертикальную половину страницы, а страница вдвое длиннее.C# Excel Interop конвертировать файл excel в pdf-файл неправильно преобразовывается
Это предварительный:
То, что я хочу, это больше похоже на это:
Я использовал онлайн конвертер, чтобы получить это изображение.
Наконец, это код, который я использую для импорта файла макета, редактирования данных в файле, сохранения и экспорта его в формате pdf.
Application oExcel = new Application();
Workbook oBook = oExcel.Workbooks.Open(string.Format("{0}\\ATH-ICT\\Waspbane Bestellingen\\Resources\\Layout.xlsx", Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)));
Worksheet oSheet = (Worksheet)oBook.Worksheets[1];
oSheet.Range["D3"].Value = customer.Name;
oSheet.Range["D4"].Value = customer.Address;
oSheet.Range["D5"].Value = string.Format("{0} {1}", customer.Postal, customer.City);
oSheet.Range["J3"].Value = DateTime.Now.Year + orderid.ToString("D4");
oSheet.Range["J5"].Value = DateTime.Now.ToString("dd/MM/yyyy");
int productNumber = 11;
foreach (Order order in customer.Orders)
{
oSheet.Range["B" + productNumber].Value = order.Amount;
oSheet.Range["D" + productNumber].Value = "st";
oSheet.Range["E" + productNumber].Value = order.Product.Name;
oSheet.Range["I" + productNumber].Formula = string.Format("={0}/{1}", order.Product.Price, 1.21);
oSheet.Range["J" + productNumber].Formula = "=PRODUCT(B11,I11)";
oSheet.Range["K" + productNumber].Value = 1;
productNumber += 2;
}
oSheet.Range["J36"].Value = shipping;
oSheet.Range["A43"].Value = string.Format("Betaald met {0}", method);
oBook.SaveAs(string.Format("{0}\\Factuur {1}{2:D4}.xlsx", savelocation, DateTime.Now.Year, orderid));
oBook.Close();
oBook = null;
oExcel.Quit();
oExcel = null;
oExcel = new Application();
oBook = oExcel.Workbooks.Open(string.Format("{0}\\Factuur {1}{2:D4}.xlsx", savelocation, DateTime.Now.Year, orderid));
oSheet = (Worksheet)oExcel.Worksheets[1];
oSheet.PageSetup.FitToPagesWide = 1;
oSheet.PageSetup.FitToPagesTall = 1;
oSheet.PageSetup.Zoom = false;
oBook.ExportAsFixedFormat(
XlFixedFormatType.xlTypePDF,
string.Format("{0}\\Factuur {1}{2:D4}.pdf", savelocation, DateTime.Now.Year, orderid),
XlFixedFormatQuality.xlQualityStandard, true, false, Type.Missing, Type.Missing, false
);
oBook.Close();
oBook = null;
oExcel.Quit();
oExcel = null;
Marshal.ReleaseComObject(oSheet);
GC.Collect();
GC.WaitForPendingFinalizers();
В конце сценария у меня есть несколько строк относительно сборщика мусора и маршал, чтобы попытаться избавиться от оставленного процесса в диспетчере задач, но не кажется, что это будет работать.
Кроме того, этот код не является наиболее эффективным. Я просто хочу, чтобы основное дело работало.
EDIT:
В случае, если вы хотите воспроизвести мой пример с тем же файлом Excel Теперь я предоставил ссылку для загрузки вниз к точному Ехчли, что я использую:
https://drive.google.com/open?id=0B6hUijkN5GM3QmZ3YkdNd1l0ejg
Заказ может иметь значение; каждый ответ, который я видел, связанный с этой проблемой, они устанавливают 'PageSetup.Zoom = false;' * before * установку 'FitToPagesWide/Tall'. Я не VSTO или COM-гуру, но я мог видеть, что это ваша проблема, если средство настройки свойств проверяет свойство масштабирования, когда оно установлено, а не в каком-то более позднем вызове. – Quantic
@Quantic Не изменилось, но спасибо. – Thodor12
Я тестировал ваш файл и ваш код и не могу воспроизвести проблему, он всегда сохраняет PDF-файл на одну страницу для меня. Обратите внимание, что я заменил все вхождения 'order',' customer', 'shipping',' orderid' и т. Д. Со случайными строками или цифрами. Также я тестировал в Excel 2010. – Quantic