C#Excel Interop将excel文件转换为pdf文件未正确转换

时间:2016-07-12 18:39:50

标签: c# pdf excel-2013 excel-interop

我正在创建一个可以处理输入excel文件并将它们保存为新文件的应用程序,之后需要将它们转换为pdf。最后,它们附在电子邮件中并被发送出去。我遇到的问题是pdf没有正确转换。我最终得到2页,每页包含页面的垂直部分,以及页面的两倍长。

这是预览:

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();

在脚本结束时,我还有一些关于垃圾收集器和编组的行,试图在任务管理器中摆脱遗留进程,但它似乎没有工作。

此外,此代码不是最有效的。我只想要基本的工作。

编辑:

如果您想使用相同的excel文件重现我的示例,我现在在下面提供了一个下载链接到我使用的确切excel文件:

https://drive.google.com/open?id=0B6hUijkN5GM3QmZ3YkdNd1l0ejg

1 个答案:

答案 0 :(得分:0)

不幸的是,我没有按照你通常使用Excel Interop的方式工作,但我找到了一个很好的选择。

我使用Spire.XLS让它运转起来。这是一项免费服务(每张excel表最多5张和150行),可以完成所有工作,甚至可以用于Excel Interop。

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