0

プログラムでdocxファイルを作成したい。その中にExcelチャートを含める必要があり、それからそれをpdfにエクスポートする必要があります。そのためにC#4.0とMicrosoft.Office.Interopを使用しています。

問題は、エクスポートされたpdfファイルでチャートの1/5の部分が切り詰められていることです。問題の例を次に示します。

PDFファイルへの2shared.comリンク

これは、xpsで保存しようとした場合にも発生します。

エクセルチャートをコピーして単語で貼り付けると、その後どういうわけか動作します...

別の問題もあります。チャートはランダムにサイズダウンされます。これは、スクリプト作成プロセス中にExcelチャートが表示されたかどうかによって異なります(この画像は2010年の単語からキャプチャされたもので、問題を赤で囲んでいます)。

ここに画像の説明を入力してください

AddOLEObjectメソッド、クラスタイプ「Excel.Chart.8」を使用して、ExcelチャートをInlineShapesとして作成します。サイズを200x200(wrdInlineShape.Width、wrdInlineShape.Height)に設定しました

アダムは私がソースコードを含めるべきだと言った。長いですが、ここに行きます:

Microsoft.Office.Interop.Word.Application app = new Microsoft.Office.Interop.Word.Application();
app.Visible = true;
Word.Document doc = app.Documents.Open(@"D:\programozás\OHV\template.docx");
string classtype = "Excel.Chart.8";
object oEndOfDoc = "\\endofdoc";
Bookmark titleBookMark = doc.Bookmarks.get_Item("title");
titleBookMark.Range.Text = "I love OHV";

for (int xi = 1; xi <= 2; xi++)
{
    //  Microsoft.Office.Interop.Word.Range wrdRng = doc.Bookmarks.get_Item(ref oEndOfDoc).Range;
    Bookmark shapeBookMark = doc.Bookmarks.get_Item("shape" + xi );
    Bookmark subtitleBookMark = doc.Bookmarks.get_Item("title" + xi);
    subtitleBookMark.Range.Text = "Super Subject";
    Word.InlineShape wrdInlineShape = doc.InlineShapes.AddOLEObject(classtype, Range: shapeBookMark.Range);
    if (wrdInlineShape.OLEFormat.ProgID == classtype)
    {
        object verb = Word.WdOLEVerb.wdOLEVerbHide;
        wrdInlineShape.OLEFormat.DoVerb(ref verb);
        Random rn = new Random();
        Excel.Workbook obook = (Excel.Workbook)wrdInlineShape.OLEFormat.Object;
        Excel.Worksheet sheet = (Excel.Worksheet)obook.Worksheets["Sheet1"];

        for (int i = 1; i <= 5; i++)
        {
            ((Microsoft.Office.Interop.Excel.Range)sheet.Cells[i, 1]).Value = i + ".";
            for (int c = 2; c <= 3; c++)
            {
                ((Microsoft.Office.Interop.Excel.Range)sheet.Cells[i, c]).Value = rn.Next(1, 5);
                ((Microsoft.Office.Interop.Excel.Range)sheet.Cells[i, c]).Value = rn.Next(1, 5);
            }
            ((Microsoft.Office.Interop.Excel.Range)sheet.Cells[i, 4]).Value = "";
        }

        wrdInlineShape.Width = 200;
        wrdInlineShape.Height = 200;
        Excel.Chart chart = obook.ActiveChart;
        obook.ActiveChart.ApplyLayout(9, Excel.XlChartType.xlColumnClustered);
        obook.ActiveChart.ChartTitle.Caption = "BMEVIHVA109 - Jelek és Rendszerek\n XY kurzus - Dr Erős Péter";
        obook.ActiveChart.ChartTitle.Font.Size = 6;

        chart.ChartArea.Fill.ForeColor.SchemeColor = 41;
        Console.WriteLine(chart.ChartArea.Fill.ForeColor.RGB);
        chart.ChartArea.Fill.BackColor.SchemeColor = 23;
        Console.WriteLine(chart.ChartArea.Fill.BackColor.RGB);
        chart.ChartArea.Fill.TwoColorGradient(Microsoft.Office.Core.MsoGradientStyle.msoGradientHorizontal, 1);

        obook.ActiveChart.SetSourceData(sheet.get_Range("A1", "B5"));
        obook.ActiveChart.Legend.Delete();
        chart.ChartArea.RoundedCorners = true;
        Excel.Axis axis = (Excel.Axis)chart.Axes(
        Excel.XlAxisType.xlCategory,
        Excel.XlAxisGroup.xlPrimary);
        axis.HasTitle = true;
        axis.AxisTitle.Text = "54 kérdőív";
        axis.AxisTitle.Font.Size = 6;
        axis.HasMajorGridlines = true;

        axis = (Excel.Axis)chart.Axes(
        Excel.XlAxisType.xlValue,
        Excel.XlAxisGroup.xlPrimary);
        axis.HasTitle = false;
        axis.HasMajorGridlines = true;
        axis.MaximumScale = 5;
        axis.MinimumScale = 0;
        wrdInlineShape.Width = 200;
        wrdInlineShape.Height = 200;
        Microsoft.Office.Interop.Word.Range tableRange = doc.Bookmarks.get_Item("table" + xi).Range;

        //  sheet.UsedRange.Copy();
        doc.SetDefaultTableStyle("Light List - Accent 4", false);
        Table table = doc.Tables.Add(tableRange, 3, 2);
        Object style = "Table Grid 1";
        table.set_Style(ref style);
        table.Cell(1, 1).Merge(table.Cell(1, 2));
        table.Cell(1, 1).Range.Text = "Válaszok száma";
        table.Cell(1, 1).Range.Font.Bold = 2;
        table.Cell(2, 1).Range.Text = "This works lol";
        table.Cell(2, 2).Range.Text = "This works lol 2 2";
        table.Cell(3, 1).Range.Text = "This works lol";
        table.Cell(3, 2).Range.Text = "This works lol 2 2";
        table.Cell(4, 1).Range.Text = "This works lol";
        table.Cell(4, 2).Range.Text = "This works lol 2 2";
        table.Borders.OutsideLineWidth = WdLineWidth.wdLineWidth225pt;
    }
}
//     doc.InlineShapes.AddPicture(@"D:\programozás\OHV\OHV\OHV\bin\Debug\Capture.JPG", false, true);
doc.SaveAs2(@"D:\programozás\OHV\Doksi.docx");

Console.WriteLine("Exit");
try
{
    //Novacode.DocX docx = Novacode.DocX.Load(@"D:\programozás\OHV\Doksi.docx");
    //docx.SaveAs(@"D:\programozás\OHV\Doksi.pdf");
    doc.ExportAsFixedFormat(@"D:\programozás\OHV\Doksi.pdf",WdExportFormat.wdExportFormatPDF);
    doc.Close();
    app.Quit();
}
catch (Exception e)
{
    Console.WriteLine(e.Message);
    Console.ReadLine();
}
4

1 に答える 1

1

この回避策を見つけました。

作成したExcelチャートをクリップボードに切り取り、同じ場所に貼り付け、2秒間待ってから、次のチャートに進みます。カット/ペーストは、チャートを別のタイプの単語オブジェクトに変換しているようです。これは、PDFを介して適切にエクスポートされます。

            wrdInlineShape.Range.Cut();
            shapeBookMark.Range.Paste();
            Thread.Sleep(2000);

(shapeBookMarkは、グラフを配置した元の範囲でした。2秒待つ必要があります。そうしないと、Wordがエラーメッセージでフリーズします)

于 2012-04-13T13:38:13.320 に答える