2012-07-12 108 views
3

我有一堆数据,我将其保存为.csv(逗号分隔值)格式。 在excel中,我可以通过手动选择数据并按Graph来轻松创建一个条形图。从CSV文件外部创建Excel图表

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

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

不知道该怎么做,或者如果excel甚至支持这样的东西,更少从一个csv文件!

谢谢。

+0

为什么在Excel中不打开CSV从C#,创建图形和然后另存为.xlsx文件? – 2012-07-12 14:53:06

回答

3

我想用EPPlus library直接创建你的excel文件。

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

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

(我假设你已经在你的应用程序数据,如果没有,检查这些答案解析CSV: CSV parser/reader for C#?CSV parser/reader for C#?

+0

我以前也使用过这个库,它的工作原理非常漂亮。基本上,不是创建在Excel中打开的.csv,而是使用相同的数据为您创建.xlsx。从那里,您可以基于该数据在.xlsx中创建一个图。 – Jake 2012-07-12 15:05:04

2

如果您在Excel做坚持,你需要有某种库连接到它。您可以使用VS Pro中包含的Office Tools或更好的版本,或者使用一些开源库,如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的东西可能更直接。

+0

嗯,你在正确的轨道上,但使用Interop时使用csv并不那么简单。如果你使用方法'Excel.Workbook wb = app.Workbooks.Open();''你必须使用'.OpenText'方法或者'.TextToColumns'方法,上面的代码将会把所有的数据放在列1中 – 2012-07-12 16:36:25

+0

你说得对,你的回答显然更彻底。我把它提高了。 – martin 2012-07-12 19:23:51

10

除了我的评论,这里是一个例子。没有必要使用第三方库。 Excel具有制作图表所需的所有功能。另外打开csv并不像在Excel中打开任何工作簿。

为了更好的理解,让我们创建一个sample.csv,并将其放置在C:它看起来像这样

enter image description here

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

输出

enter image description here

+1

这很好。即使从控制台应用。我只需删除“使用System.Reflection;”和“使用Microsoft.Office.Interop.Excel;”之外的所有“使用”。顺便说一下,为了保存结果,使用'xlWorkBooks [1] .SaveAs(“c:\\ Sample”,XlFileFormat.xlOpenXMLWorkbook);' – 2015-11-09 21:17:42