2016-07-12 7 views
0

Я создаю приложение, которое может обрабатывать файлы ввода excel и сохранять их как новый файл, после чего их нужно преобразовать в pdf. Наконец, они прикреплены к электронному письму и отправляются. Проблема, с которой я сталкиваюсь, заключается в том, что PDF-код не преобразован должным образом. В итоге я получаю 2 страницы, каждая из которых содержит вертикальную половину страницы, а страница вдвое длиннее.C# Excel Interop конвертировать файл excel в pdf-файл неправильно преобразовывается

Это предварительный:

enter image description here

То, что я хочу, это больше похоже на это:

enter image description here

Я использовал онлайн конвертер, чтобы получить это изображение.

Наконец, это код, который я использую для импорта файла макета, редактирования данных в файле, сохранения и экспорта его в формате 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

+1

Заказ может иметь значение; каждый ответ, который я видел, связанный с этой проблемой, они устанавливают 'PageSetup.Zoom = false;' * before * установку 'FitToPagesWide/Tall'. Я не VSTO или COM-гуру, но я мог видеть, что это ваша проблема, если средство настройки свойств проверяет свойство масштабирования, когда оно установлено, а не в каком-то более позднем вызове. – Quantic

+0

@Quantic Не изменилось, но спасибо. – Thodor12

+0

Я тестировал ваш файл и ваш код и не могу воспроизвести проблему, он всегда сохраняет PDF-файл на одну страницу для меня. Обратите внимание, что я заменил все вхождения 'order',' customer', 'shipping',' orderid' и т. Д. Со случайными строками или цифрами. Также я тестировал в Excel 2010. – Quantic

ответ

0

К сожалению Я не получил его работать так, как вы обычно это делаете, используя Excel Interop, но я нашел отличную альтернативу.

Я использовал Spire.XLS, чтобы заставить его работать. Это бесплатный сервис (до 5 листов и 150 строк на листе Excel), который может делать все и даже больше, чем Excel Interop.

http://www.e-iceblue.com/Introduce/excel-for-net-introduce.html