【问题标题】:Externally create an excel graph from a CSV file [closed]从 CSV 文件外部创建 excel 图表 [关闭]
【发布时间】:2012-07-12 08:30:07
【问题描述】:

我有一堆数据要保存为 .csv(逗号分隔值)格式。 在 excel 中,我可以通过手动选择数据并点击 Graph 轻松创建条形图。

但是,我想通过单击按钮在外部执行此操作。

理想情况下,我在 C# 中点击了一个按钮。这会调用一个生成我的 .csv 文件的方法,然后调用一个创建 excel 表的 excel 函数,并在其中创建图表。

不知道该怎么做,或者excel是否支持这样的东西,更不用说来自csv文件了!

谢谢。

【问题讨论】:

  • 为什么不在 Excel 中从 C# 打开 csv,创建图形,然后保存为 .xlsx 文件?

标签: c# excel csv graph


【解决方案1】:

除了我的评论,这里是一个例子。无需使用第 3 方库。 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();
            }
        }
    }
}

输出

【讨论】:

  • 这很好用。即使来自控制台应用程序。我只需要删除除using System.Reflection;using Microsoft.Office.Interop.Excel; 之外的所有“使用”。顺便说一句,要保存结果,请使用xlWorkBooks[1].SaveAs("c:\\Sample", XlFileFormat.xlOpenXMLWorkbook);
【解决方案2】:

我会尝试使用 EPPlus library 直接创建您的 excel 文件。

它支持图表,并且在我过去的项目中通常效果很好。最简单的方法可能是在 Excel 中准备一个带有空白数据的“模板”文件(只是普通的 xlsx 文件)并插入所需的图表和任何其他必需的元素。然后,您可以在 C# 中使用该库打开模板文件,用数据填充数据表,然后将其保存为另一个带有实际数据的 xlsx 文件。

可能需要设置一些用于“重新计算”数据的标志,这会在打开文件时发生。不确切知道该库,但我过去用于 xls 文件的另一个库需要它。

(我想您的应用程序中已经有数据,如果没有,请检查这些答案以解析 CSV: CSV parser/reader for C#?, CSV parser/reader for C#?)

【讨论】:

  • 我过去也使用过这个库,它运行良好。基本上,它不会创建您在 Excel 中打开的 .csv,而是使用相同的数据为您创建一个 .xlsx。从那里,您可以根据该数据在该 .xlsx 中创建一个图表。
【解决方案3】:

如果您坚持在 Excel 中执行此操作,则需要有某种库来连接到它。您可以使用 VS Pro 中包含的 Office 工具和更好的工具,也可以使用一些开源库,例如 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 documentation

但我认为使用Gnuplot 之类的东西可能更直接。

【讨论】:

  • 嗯,您在正确的轨道上,但是在使用 Interop 时使用 csv 并不是那么简单。如果您使用 Excel.Workbook wb = app.Workbooks.Open(&lt;path to csv&gt;); 方法,上面的代码会将所有数据放入 Col 1 您必须使用 .OpenText 方法或执行 .TextToColumns
  • 你是对的,你的回答显然更彻底。我投了赞成票。
猜你喜欢
  • 2011-01-26
  • 1970-01-01
  • 2011-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多