3

.csv(カンマ区切り値)形式で保存しているデータがたくさんあります。Excelでは、データを手動で選択してグラフを押すことで、この棒グラフを簡単に作成できます。

ただし、ボタンをクリックするだけで外部的にこれを実行したいと思います。

理想的には、C#でボタンを押します。これにより、.csvファイルを生成するメソッドが呼び出され、グラフが作成されたExcelシートを作成するExcel関数が呼び出されます。

これをどうやって行うのかわからない、またはExcelがこのようなものをサポートしている場合でも、csvファイルからははるかに少ないです!

ありがとうございました。

4

3 に答える 3

10

私のコメントに加えて、ここに例があります。サードパーティのライブラリを使用する必要はありません。Excelには、グラフを作成するために必要なすべてのものがあります。また、csvを開くことは、Excelでブックを開くこととは異なります。

理解を深めるために、を作成して、次のようsample.csvに配置してみましょう。C:

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

C#で新しいフォームを作成し、ボタンを配置して、Excelオブジェクトライブラリへの参照を設定します。次に、このコードをボタンのクリックイベントに貼り付けます

試してテストしました

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Excel = Microsoft.Office.Interop.Excel;

Namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        Public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {

            Microsoft.Office.Interop.Excel.Application xlexcel;
            Microsoft.Office.Interop.Excel.Worksheet xlWorkSheet;

            object misValue = System.Reflection.Missing.Value;
            xlexcel = new Excel.Application();

            var xlWorkBooks = xlexcel.Workbooks;

            xlexcel.Visible = true;


            xlWorkBooks.OpenText("C:\\Sample.csv", misValue, misValue, Excel.XlTextParsingType.xlDelimited,
                                 Excel.XlTextQualifier.xlTextQualifierNone, misValue, misValue,
                                 misValue, misValue, misValue, misValue, misValue, misValue, misValue,
                                 misValue, misValue, misValue, misValue);

            // Set Sheet 1 as the sheet you want to work with
            xlWorkSheet = (Excel.Worksheet)xlWorkBooks[1].Worksheets.get_Item(1);

            xlWorkSheet.Shapes.AddChart(misValue,misValue,misValue,misValue,misValue).Select();

            //~~> Make it a Line Chart
            xlexcel.ActiveChart.ApplyCustomType(Excel.XlChartType.xlLineMarkers);

            //~~> Set the data range
            xlexcel.ActiveChart.SetSourceData(xlWorkSheet.Range["$A$1:$B$6"]);

            //uncomment this if required
            //xlWorkBooks[1].Close(true, misValue, misValue);
            //xlexcel.Quit();

            //releaseObject(xlWorkSheet);
            //releaseObject(xlWorkBook);
            //releaseObject(xlexcel);
        }

        private void releaseObject(object obj)
        {
            try
            {
                System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
                obj = null;
            }
            catch (Exception ex)
            {
                obj = null;
                MessageBox.Show("Unable to release the Object " + ex.ToString());
            }
            finally
            {
                GC.Collect();
            }
        }
    }
}

出力

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

于 2012-07-12T16:50:55.887 に答える
3

Excelファイルを直接作成するためにEPPlusライブラリを試してみます。

チャートをサポートし、過去の私のプロジェクトでは一般的にうまく機能しました。最も簡単な方法は、空白のデータを含む「テンプレート」ファイル(通常のxlsxファイル)をExcelで準備し、目的のグラフやその他の必要な要素を挿入することです。次に、そのライブラリを含むテンプレートファイルをC#で開き、データシートにデータを入力して、実際のデータを含む別のxlsxファイルとして保存します。

たぶん、データの「再計算」のためのフラグを設定する必要があります。これは、ファイルが開かれたときに発生します。そのライブラリについては正確にはわかりませんが、過去にxlsファイルに使用した別のライブラリに必要でした。

(アプリケーションにすでにデータがあると思いますが、そうでない場合は、CSVを解析するための回答を確認してください: C#のCSVパーサー/リーダー、 C#のCSVパーサー/リーダー?

于 2012-07-12T14:51:08.520 に答える
2

Excelでそれを行うことを主張する場合は、それに接続するための何らかのライブラリが必要になります。VSPro以降に含まれているOfficeToolsを使用するか、NetOfficeなどのオープンソースライブラリを使用できます。次に、次のようなコードを記述できます。

Excel.Application app = new Excel.Application();
Excel.Workbook wb = app.Workbooks.Open(<path to csv>);
Excel.Worksheet ws = (Excel.Worksheet)wb.Worksheets[1];
Excel.Chart chart = ((Excel.ChartObjects)ws.ChartObjects()).Add(0, 0, 100, 100).Chart; //the numbers are position and dimensions of the chart
chart.ChartWizard(); // here you have to format your chart, see link below
wb.SaveAs(<output path and format>);

MSDNドキュメントへのリンク。

しかし、 gnuplotのようなものを使用する方がおそらくはるかに簡単だと思います。

于 2012-07-12T15:12:39.333 に答える