用C#操作Excel以及产生Chart

原创 2013年02月19日 16:04:18

简介

用一个小范例示范如何在C#中操作Excel

代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Excel = Microsoft.Office.Interop.Excel;

namespace TestExcel
{
    public class CBExcel
    {
        Excel.Application xlApp;    // 声明需要的 Exccel Application 变量
        Excel.Workbook xlWorkBook;  // 声明 work book
        Excel.Worksheet xlWorkSheet;// 声明 excel 的sheet
        object misValue = System.Reflection.Missing.Value;

        public CBExcel()
        {
        }

        // 设定数据
        public void SetData(int i, int j, string data)
        {
            xlWorkSheet.Cells[i, j] = data;
        }

        // 插入一个图表到excel分页中
        public void SetChart(string start, string end, Excel.XlChartType type)
        {
            Excel.Range chartRange;

            Excel.ChartObjects xlCharts = (Excel.ChartObjects)xlWorkSheet.ChartObjects(Type.Missing); // 建立图表
            Excel.ChartObject myChart = (Excel.ChartObject)xlCharts.Add(10, 80, 300, 250); //加入图表及设定大小
            Excel.Chart chartPage = myChart.Chart;

            chartRange = xlWorkSheet.get_Range(start, end); // 设定图表数据的开始与结尾
            chartPage.SetSourceData(chartRange, misValue);
            chartPage.ChartType = type; // 设定图表的样式
        }

        // 释放用的函数
        private void releaseObject(object obj)
        {
            try
            {
                System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
                obj = null;
            }
            catch
            {
                obj = null;
            }
            finally
            {
                GC.Collect();
            }
        }

        // 创建一个excel
        public void Create()
        {
            xlApp = new Excel.ApplicationClass(); // 创建一个excel
            xlWorkBook = xlApp.Workbooks.Add(misValue);
            xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1); // 取得第一页的分页
        }

        // 储存excel
        public void SaveAs()
        {
            // 这样储存会跳出一个另存文件视窗
            xlWorkBook.Close(true, misValue, misValue);
            xlApp.Quit();
        }

        public void Release()
        {
            // 释放用到的excel实例
            releaseObject(xlWorkSheet);
            releaseObject(xlWorkBook);
            releaseObject(xlApp);
        }
    }
}
这是一个经过简单封装过的类,将一些操作的部份封装在一个类中,好方便使用。

使用的代码

private void button1_Click(object sender, EventArgs e)
{
    CBExcel excel = new CBExcel(); // 创建CBExcel类
    excel.Create(); // 建立Excel
    excel.SetData(1, 1, ""); // 设定数据
    excel.SetData(1, 2, "Student1");
    excel.SetData(1, 3, "Student2");
    excel.SetData(1, 4, "Student3");

    excel.SetData(2, 1, "Term1");
    excel.SetData(2, 2, "80");
    excel.SetData(2, 3, "65");
    excel.SetData(2, 4, "45");

    excel.SetData(3, 1, "Term2");
    excel.SetData(3, 2, "81");
    excel.SetData(3, 3, "61");
    excel.SetData(3, 4, "41");

    excel.SetData(4, 1, "Term3");
    excel.SetData(4, 2, "82");
    excel.SetData(4, 3, "62");
    excel.SetData(4, 4, "42");

    excel.SetChart("A1", "D4", Excel.XlChartType.xlLine); // 设定图表样式与开始结束位置
    excel.SaveAs(); // 储存Excel
    excel.Release();// 释放内存
}


excel输出结果

范例下载

http://download.csdn.net/detail/cloudhsu/5072683

2013/02/20新增

支持Excel与CSV数据汇出的代码

因为在实际的需求中,公司中的一些计算机可能不会安装Excel,为了让汇出的工作能正常运作,因此我做了下列的修正

接口:IExcel用来作抽象

interface IExcel
{
    void Create();
    void SetData(int i, int j, string data);
    void SaveAs();
    void Release();
}

CBExcel的部份则实践IExcel接口

public class CBExcel : IExcel
{
    Excel.Application xlApp;
    Excel.Workbook xlWorkBook;
    Excel.Worksheet xlWorkSheet;
    object misValue = System.Reflection.Missing.Value;
    const string ChartStart = "A1";
    string m_ChartEnd;
    int m_MaxI;
    int m_MaxJ;
    public CBExcel()
    {
        m_ChartEnd = "A1";
        m_MaxI = -1;
        m_MaxJ = -1;
    }

    public void SetData(int i, int j, string data)
    {
        xlWorkSheet.Cells[i, j] = data;
        CheckChartEnd(i, j);
    }

    private void CheckChartEnd(int i, int j)
    {
        if (m_MaxI <= i)
            m_MaxI = i;
        if (m_MaxJ <= j)
            m_MaxJ = j;
        const int a = 0x41;
        int word = a + j - 1;
        m_ChartEnd = string.Format("{0}{1}", Convert.ToChar(word), m_MaxI);
    }

    public void SetChart(Excel.XlChartType type)
    {
        Excel.Range chartRange;

        Excel.ChartObjects xlCharts = (Excel.ChartObjects)xlWorkSheet.ChartObjects(Type.Missing);
        Excel.ChartObject myChart = (Excel.ChartObject)xlCharts.Add(500, 80, 350, 350);
        Excel.Chart chartPage = myChart.Chart;

        chartRange = xlWorkSheet.get_Range(ChartStart, m_ChartEnd);
        chartPage.SetSourceData(chartRange, misValue);
        chartPage.ChartType = type;
    }

    public void SetChart(string start, string end, Excel.XlChartType type)
    {
        Excel.Range chartRange;

        Excel.ChartObjects xlCharts = (Excel.ChartObjects)xlWorkSheet.ChartObjects(Type.Missing);
        Excel.ChartObject myChart = (Excel.ChartObject)xlCharts.Add(500, 80, 350, 350);
        Excel.Chart chartPage = myChart.Chart;

        chartRange = xlWorkSheet.get_Range(start, end);
        chartPage.SetSourceData(chartRange, misValue);
        chartPage.ChartType = type;
    }

    private void releaseObject(object obj)
    {
        try
        {
            System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
            obj = null;
        }
        catch
        {
            obj = null;
        }
        finally
        {
            GC.Collect();
        }
    }

    public void Create()
    {
        xlApp = new Excel.ApplicationClass();
        xlWorkBook = xlApp.Workbooks.Add(misValue);
        xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
    }

    public void SaveAs()
    {
        SetChart(Excel.XlChartType.xlLine);
        xlWorkBook.Close(true, misValue, misValue);
        xlApp.Quit();
    }

    public void Release()
    {
        releaseObject(xlWorkSheet);
        releaseObject(xlWorkBook);
        releaseObject(xlApp);
    }
}

额外在实践一个CBExcelCSV

我用最偷懒的实践手法,直接开个够大的内存来存数据

public class CBExcelCSV : IExcel
{
    List<string[]> m_data = new List<string[]>();

    const int MAX_COLUMN = 150;
    const int MAX_LINE = 2000;
    int m_MaxLine;
    int m_MaxColumn;

    #region IExcel Members

    public void Create()
    {
        m_MaxColumn = -1;
        m_MaxLine = MAX_LINE;
        for (int i = 0; i < MAX_LINE; i++)
        {
            m_data.Add(new string[MAX_COLUMN]);
        }
    }

    public void SetData(int i, int j, string data)
    {
        if (i-1 >= m_MaxLine)
        {
            m_data.Add(new string[MAX_COLUMN]);
            m_MaxLine++;
        }
        if (m_MaxColumn < j)
        {
            m_MaxColumn = j;
        }
        m_data[i-1][j-1] = data;
    }

    public void SaveAs()
    {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < m_data.Count; i++ )
        {
            sb.Append(m_data[i][0]);
            for (int j = 1; j < m_MaxColumn; j++)
            {
                sb.Append(",");
                sb.Append(m_data[i][j]);
            }
            sb.Append("\r\n");
        }
        save(sb.ToString());
    }

    void save(string data)
    {
        SaveFileDialog saveFileDialog1 = new SaveFileDialog();

        saveFileDialog1.Filter = "csv files (*.csv)|*.csv|All files (*.*)|*.*";
        saveFileDialog1.FilterIndex = 1;
        saveFileDialog1.RestoreDirectory = true;

        if (saveFileDialog1.ShowDialog() == DialogResult.OK)
        {
            string fileName = saveFileDialog1.FileName;
            File.WriteAllText(fileName, data);
        }
    }

    public void Release()
    {
    }

    #endregion
}

再实践一个CBExcelWrapper来封装,里面有一个IExcel成员,并将所有的执行交给IExcel的实例执行。

public class CBExcelWrapper : IExcel
{
    IExcel excel;
    bool m_IsExcelInstalled;
    public CBExcelWrapper()
    {
        m_IsExcelInstalled = CheckExcelInstalled();
        // 有安装Excel就使用CBExcel类,没有则使用CBExcelCSV类
        if(m_IsExcelInstalled)
        {
            excel = new CBExcel();
        }
        else
        {
            excel = new CBExcelCSV();
        }
    }

    bool CheckExcelInstalled()
    {
        // 这一段代码的重点就是判断到底有没有装Excel
        bool installed = false;
        Type officeType = Type.GetTypeFromProgID("Excel.Application");
        if (officeType != null)
        {
            installed = true;
        }
        return installed;
    }

    #region IExcel Members

    public void Create()
    {
        excel.Create();
    }

    public void SaveAs()
    {
        excel.SaveAs();
    }

    public void Release()
    {
        excel.Release();
    }

    public void SetData(int i, int j, string data)
    {
        excel.SetData(i, j, data);
    }

    #endregion
}


C#操作EXCEl的chart折线图 封转的类

public class ExcelPapamMolde     {         ///         /// 绑定X轴开始行         ///         public...
  • yeeonefx
  • yeeonefx
  • 2014年11月06日 10:02
  • 994

用C#读取excel中的数据,并绘制曲线

using System; using System.Windows.Forms; using Microsoft.Office.Interop.Excel;namespace WindowsFo...
  • sz790739116
  • sz790739116
  • 2017年02月08日 14:53
  • 801

使用C#和Excel进行报表开发,生成统计图(Chart)

  • 2015年08月20日 22:02
  • 309KB
  • 下载

使用C#和Excel进行报表开发-生成统计图Chart

原文地址:http://www.opent.cn/a/094/1235.shtml有的Web项目选用Excel作为报表方案,在服务器端生成Excel文件,然后传送到客户端,由客户端进行打印。在国内的环...
  • liuyuehui110
  • liuyuehui110
  • 2017年04月01日 17:16
  • 1507

使用C#和Excel进行报表开发(八)-用程序绑定数据源

原文地址:http://www.cnblogs.com/dahuzizyd/archive/2007/04/11/CSharp_Excel_Report_Chart_All.html 整个系列均...
  • mystudyblog0507
  • mystudyblog0507
  • 2012年08月29日 10:51
  • 498

EXCEL 笔记

EXCEL常用公式: 8位随机码 =CONCATENATE(IF(INT(RAND()*3)=0,CHAR(INT(RAND()*10+48)),IF(INT(RAND()*2)=0,CHAR(I...
  • jx520
  • jx520
  • 2014年07月21日 10:01
  • 722

C#中操作Excel(4)—— 向Excel中插入两种图表以及设置图表格式

引言         本文主要讨论下向Excel中插入图表的两种方式。在Excel中图表是有两种级别的,一种是和sheet同级别的图表,也就是说整个excel的标签页就是一个图表;还有一种就是我们最...
  • lzhui1987
  • lzhui1987
  • 2016年11月18日 11:41
  • 3106

c# 操作excel chart

private void button1_Click(object sender, System.EventArgs e){ Excel.Application oXL; Excel._Workboo...
  • kexijun20014
  • kexijun20014
  • 2009年09月21日 10:51
  • 321

Chart控件显示比例

比如,显示某一年公司各类别产品的销售图表,图表类型为饼图,控件会根据销售占比自己分割区块,但显示的label依然是其销量。如何能够显示出各类别产品销量在总销量中所占百分比呢? 当然,通过计算得出然后...
  • aiminXMPP
  • aiminXMPP
  • 2013年04月17日 16:39
  • 979

使用C#和Excel进行报表开发(八)-用程序绑定数据源

http://www.cnblogs.com/fmxyw/archive/2008/09/09/1287854.html 本文演示一个简单的办法,并使用程序将一个dataset中的内容填充到指定的格子...
  • jackyxu_2008
  • jackyxu_2008
  • 2009年04月23日 12:28
  • 322
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用C#操作Excel以及产生Chart
举报原因:
原因补充:

(最多只允许输入30个字)