C# 从CSV文件外部创建excel图形

C# 从CSV文件外部创建excel图形,c#,excel,csv,graph,C#,Excel,Csv,Graph,我有一堆数据要保存成.csv(逗号分隔值)格式。 在excel中,我可以通过手动选择数据并点击图形,轻松创建一个条形图 但是,我希望通过单击按钮在外部执行此操作 理想情况下,我按C#键。这将调用一个生成.csv文件的方法,然后调用一个excel函数来创建excel工作表,并在其中创建图形 不知道该怎么做,或者excel是否支持类似的东西,更不用说csv文件了 谢谢。我想用它直接创建excel文件 它支持图表,并且在过去对我的项目通常非常有效。最简单的方法可能是在Excel中准备一个包含空白数据的

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

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

理想情况下,我按C#键。这将调用一个生成.csv文件的方法,然后调用一个excel函数来创建excel工作表,并在其中创建图形

不知道该怎么做,或者excel是否支持类似的东西,更不用说csv文件了

谢谢。

我想用它直接创建excel文件

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

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

(我假设您的应用程序中已经有您的数据,如果没有,请检查这些答案以解析CSV:
,)

如果您坚持在Excel中执行此操作,则需要使用某种库来连接它。您可以使用VS Pro和更高版本中包含的Office工具,也可以使用类似的开源库。然后您可以编写如下代码:

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>);
Excel.Application app=新建Excel.Application();
Excel.Workbook wb=app.Workbooks.Open();
Excel.Worksheet ws=(Excel.Worksheet)wb.Worksheet[1];
Chart Chart=((Excel.ChartObjects)ws.ChartObjects()).Add(0,0,100,100).Chart//数字是图表的位置和尺寸
chart.ChartWizard();//在这里您必须格式化您的图表,请参阅下面的链接
wb.SaveAs();
链接到


但我认为使用类似的方法可能更简单。

在我的评论之后,这里有一个例子。不需要使用第三方库。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();
            }
        }
    }
}
输出


为什么不从C#在Excel中打开csv,创建图形,然后另存为.xlsx文件?我过去也使用过这个库,它工作得很好。基本上,它不会创建在Excel中打开的.csv,而是为您创建一个具有相同数据的.xlsx。从那里,您可以基于该数据在.xlsx中创建一个图形。嗯,您的思路是正确的,但是当您使用互操作时,使用csv并不是那么简单。如果使用方法
Excel.Workbook wb=app.Workbooks.Open(),上述代码将把所有数据放在第1列
你要么使用
.OpenText
方法,要么使用
.TextToColumns
你是对的,你的答案显然更全面。我投了更高的票,效果很好。甚至从控制台应用程序。除了
使用System.Reflection之外,我只需要删除所有的“using”
。顺便说一下,要保存结果,请使用
xlWorkBooks[1].SaveAs(“c:\\Sample”,XlFileFormat.xlOpenXMLWorkbook)