owc图表,Excel帮助类

/// <summary>
/// OwcExecelHelper 的摘要说明
/// </summary>
public class OwcExcelHelper
{
    public OwcExcelHelper(string fullFileName)
    {
        this._fullFileName = fullFileName;
    }
    private readonly string _fullFileName;
    private SpreadsheetClass _excelNotional = new SpreadsheetClass();
    /// <summary>
    /// 物理路径名
    /// </summary>
    public string FullFileName
    {
        get { return this._fullFileName; }
    }

    /// <summary>
    /// 将一个DataTable导出为Execel
    /// </summary>
    /// <param name="table">数据源</param>
    /// <returns>从新生成的Excel物理文件上得到的内存流</returns>
    public void ExportToExcel(DataTable table)
    {
        DataSet ds = new DataSet();
        ds.Tables.Add(table);
        this.ExportToExcel(ds);
       
    }
    /// <summary>
    /// 将一个DataSet导出为Execel
    /// </summary>
    /// <param name="dataSet">数据源</param>
    /// <returns>从新生成的Excel物理文件上得到的内存流</returns>
    public void ExportToExcel(DataSet dataSet)
    {
        Workbook workbook = this._excelNotional.ActiveWorkbook;
        CreateWorksheet(workbook, dataSet);
        this._excelNotional.Export(
            this._fullFileName,
            SheetExportActionEnum.ssExportActionNone,
            SheetExportFormat.ssExportAsAppropriate);
    }

    /// <summary>
    /// 创建工作页
    /// </summary>
    private void CreateWorksheet(Workbook workbook, DataSet dataSet)
    {
        (workbook.Worksheets[workbook.Worksheets.Count] as Worksheet).Delete();
        (workbook.Worksheets[workbook.Worksheets.Count] as Worksheet).Delete();
        if (dataSet.Tables.Count > 0)
        {
            (workbook.Worksheets[1] as Worksheet).Name = dataSet.Tables[0].TableName;
        }
        for (int i = 1; i < dataSet.Tables.Count; i++)
        {
            Worksheet worksheet = (workbook.Worksheets.Add(Type.Missing, workbook.Worksheets[i], 1, Type.Missing)) as Worksheet;
            worksheet.Name = dataSet.Tables[i].TableName;
        }
        for (int i = 0; i < dataSet.Tables.Count; i++)
        {
            CreateFirstRow((workbook.Worksheets[i + 1]) as Worksheet, dataSet.Tables[i]);
            CreateOtherRows((workbook.Worksheets[i + 1]) as Worksheet, dataSet.Tables[i]);
        }
    }

    /// <summary>
    /// 设置给定工作页的首行
    /// </summary>
    private void CreateFirstRow(Worksheet worksheet, DataTable table)
    {
        for (int i = 0; i < table.Columns.Count; i++)
        {
            Range range = (worksheet.Cells[1, i + 1] as Range);
            range.Font.set_Bold(true);
            range.set_RowHeight(30);
            range.set_HorizontalAlignment(XlHAlign.xlHAlignCenter);
            range.set_VerticalAlignment(XlVAlign.xlVAlignCenter);
            range.Value2 = table.Columns[i].ToString();
        }
    }

    /// <summary>
    /// 设置给定工作页的首行之外的其他行
    /// </summary>
    private void CreateOtherRows(Worksheet worksheet, DataTable table)
    {
        for (int i = 0; i < table.Rows.Count; i++)
        {
            for (int j = 0; j < table.Columns.Count; j++)
            {
                (worksheet.Cells[i + 2, j + 1] as Range).Value2 = table.Rows[i][j];
            }
        }
    }

    /// <summary>
    /// 获取内存流
    /// </summary>
    /// <returns></returns>
    public MemoryStream GetMemoryStream()
    {
        const int BUFFER_SIZE = 4096;
        MemoryStream memoryStream = new MemoryStream();
        using (FileStream fileStream = new FileStream(this._fullFileName, FileMode.Open))
        {
            using (BufferedStream bufferedStream = new BufferedStream(fileStream))
            {
                byte[] buffer = new byte[BUFFER_SIZE];
                int bufferLength;
                while ((bufferLength = bufferedStream.Read(buffer, 0, BUFFER_SIZE)) > 0)
                {
                    memoryStream.Write(buffer, 0, bufferLength);
                }
            }
        }
        return memoryStream;
    }
}

==============================

<summary>
/// OwcChartHelper 的摘要说明
/// </summary>
public class OwcChartHelper
{
    public OwcChartHelper(string fullFileName)
    {
        this._fullFileName = fullFileName;
    }
    private readonly string _fullFileName;
    private const int DEFAULT_CHART_WIDTH = 500;
    private const int DEFAULT_CHART_HEIGHT = 500;
    private const string FILE_EXTEND = "gif";
    private ChartSpace _chartSpace = new ChartSpace();

    /// <summary>
    /// 物理路径名,gif格式
    /// </summary>
    public string FullFileName
    {
        get { return this._fullFileName; }
    }
  

    #region 生成柱状图
    /// <summary>
    /// 生成柱状图
    /// </summary>
    /// <param name="table">数据源,第一列为x座标,第二列为Y轴上的数值,第三列之后为数值多序列</param>
    /// <param name="is3D">是否显示为3D效果</param>
    /// <param name="hasLegent">是否显示图例</param>
    /// <param name="showPointY">是否显示交叉点的Y轴数据</param>
    /// <param name="chartWidth">图表的宽度</param>
    /// <param name="chartHeight">图表的高度</param>
    /// <returns></returns>
    public void CreateColumnChart(DataTable table, bool is3D, bool hasLegent, bool showPointY, int chartWidth, int chartHeight)
    {
        ChChart chart = this._chartSpace.Charts.Add(0);                                             //在图表空间中添加一个图表
        chart.Type = is3D ? ChartChartTypeEnum.chChartTypeColumnClustered3D : ChartChartTypeEnum.chChartTypeColumnClustered; //图表类型
        chart.HasTitle = true; chart.Title.Caption = table.TableName;                               //设置图表标题
        chart.HasLegend = hasLegent;                                                                //是否有图例
        chart.Axes[0].HasTitle = true; chart.Axes[0].Title.Caption = table.Columns[0].ColumnName;   //x轴的标题
        if (table.Columns.Count == 2)
        {
            //当图表为一个序列时,才设置y轴的标题,多个序列时,y轴的标题无法确定
            chart.Axes[1].HasTitle = true; chart.Axes[1].Title.Caption = table.Columns[1].ColumnName;   //y轴的标题
        }

        //将类型字段保存到一个字符串变量,用"/t"分隔
        string typeString = "";
        foreach (DataRow row in table.Rows)
        {
            typeString += row[0].ToString() + "/t";
        }

        for (int i = 1; i < table.Columns.Count; i++)
        {
            //将值字段保存到一个字符串变量,用"/t"分隔
            string dataString = "";
            foreach (DataRow row in table.Rows)
            {
                dataString += row[i].ToString() + "/t";
            }
            //新建一个序列
            ChSeries series = chart.SeriesCollection.Add(0);
            series.Caption = table.Columns[i].ColumnName.ToString();
            //设置类型字段(x轴)的值
            series.SetData(ChartDimensionsEnum.chDimCategories, (int)ChartSpecialDataSourcesEnum.chDataLiteral, typeString);
            //设置值字段(y轴)的值
            series.SetData(ChartDimensionsEnum.chDimValues, (int)ChartSpecialDataSourcesEnum.chDataLiteral, dataString);
            if (showPointY)
            {
                //值标签
                series.DataLabelsCollection.Add().HasValue = true;
            }
        }
        //生成图表,并保存为图片
        this._chartSpace.ExportPicture(this._fullFileName, FILE_EXTEND, chartWidth, chartHeight);
    }

    /// <summary>
    /// 生成柱状图
    /// </summary>
    /// <param name="table">数据源,第一列为x座标,第二列为Y轴上的数值,第三列之后为数值多序列</param>
    /// <param name="chartWidth">图表的宽度</param>
    /// <param name="chartHeight">图表的高度</param>
    /// <returns></returns>
    public void CreateColumnChart(DataTable table, int chartWidth, int chartHeight)
    {
        this.CreateColumnChart(table, false, true, true, chartWidth, chartHeight);
    }

    /// <summary>
    /// 生成柱状图
    /// </summary>
    /// <param name="table">数据源,第一列为x座标,第二列为Y轴上的数值,第三列之后为数值多序列</param>
    /// <returns></returns>
    public void CreateColumnChart(DataTable table)
    {
        this.CreateColumnChart(table, false, true, true, DEFAULT_CHART_WIDTH, DEFAULT_CHART_HEIGHT);

    }
    #endregion

    #region 生成饼状图
    /// <summary>
    /// 生成饼状图
    /// </summary>
    /// <param name="table">数据源,第一列为分类,第二列为数值,第三列及之后的列不处理</param>
    /// <param name="is3D">是否显示为3D效果</param>
    /// <param name="hasLegent">是否显示图例</param>
    /// <param name="chartWidth">图表的宽度</param>
    /// <param name="chartHeight">图表的高度</param>
    /// <returns></returns>
    public void CreatePieChart(DataTable table, bool is3D, bool hasLegent, int chartWidth, int chartHeight)
    {
        ChChart chart = this._chartSpace.Charts.Add(0);
        chart.Type = is3D ? ChartChartTypeEnum.chChartTypePie3D : ChartChartTypeEnum.chChartTypePie;
        chart.HasTitle = true;
        chart.Title.Caption = table.TableName;
        chart.HasLegend = hasLegent;

        string typeString = "";
        string dataString = "";
        foreach (DataRow row in table.Rows)
        {
            typeString += row[0].ToString() + ":(" + row[1].ToString() + ")/t";
            dataString += row[1].ToString() + "/t";
        }
        ChSeries series = chart.SeriesCollection.Add(0);
        series.SetData(ChartDimensionsEnum.chDimCategories, (int)ChartSpecialDataSourcesEnum.chDataLiteral, typeString);
        series.SetData(ChartDimensionsEnum.chDimValues, (int)ChartSpecialDataSourcesEnum.chDataLiteral, dataString);
        //值标签
        ChDataLabels labels = series.DataLabelsCollection.Add();
        labels.HasPercentage = true;
        labels.HasValue = false;
        this._chartSpace.ExportPicture(this._fullFileName, FILE_EXTEND, chartWidth, chartHeight);
    }

    /// <summary>
    /// 生成饼状图
    /// </summary>
    /// <param name="table">数据源,第一列为分类,第二列为数值,第三列及之后的列不处理</param>
    /// <param name="chartWidth">图表的宽度</param>
    /// <param name="chartHeight">图表的高度</param>
    /// <returns></returns>
    public void CreatePieChart(DataTable table, int chartWidth, int chartHeight)
    {
        this.CreatePieChart(table, false, true, chartWidth, chartHeight);
    }

    /// <summary>
    /// 生成饼状图
    /// </summary>
    /// <param name="table">数据源,第一列为分类,第二列为数值,第三列及之后的列不处理</param>
    /// <returns></returns>
    public void CreatePieChart(DataTable table)
    {
        this.CreatePieChart(table, false, true, DEFAULT_CHART_WIDTH, DEFAULT_CHART_HEIGHT);
    }
    #endregion

    #region 生成曲线图
    /// <summary>
    /// 生成曲线图
    /// </summary>
    /// <param name="table">数据源,第一列为x座标,第二列及之后的列为Y轴上的数值</param>
    /// <param name="hasLegent">是否显示图例</param>
    /// <param name="showPointY">是否显示交叉点的Y轴数据</param>
    /// <param name="chartWidth">图表的宽度</param>
    /// <param name="chartHeight">图表的高度</param>
    /// <returns></returns>
    public void CreateSmoothLineChart(DataTable table, bool hasLegent, bool showPointY, int chartWidth, int chartHeight)
    {
        ChChart chart = this._chartSpace.Charts.Add(0);                                             //在图表空间中添加一个图表
        chart.Type = ChartChartTypeEnum.chChartTypeSmoothLine;                                      //设置图表类型
        chart.HasTitle = true; chart.Title.Caption = table.TableName;                               //设置图表标题
        chart.HasLegend = hasLegent;                                                                //是否有图例
        chart.Axes[0].HasTitle = true; chart.Axes[0].Title.Caption = table.Columns[0].ColumnName;   //x轴的标题
        if (table.Columns.Count == 2)
        {
            //当图表为一个序列时,才设置y轴的标题,多个序列时,y轴的标题无法确定
            chart.Axes[1].HasTitle = true; chart.Axes[1].Title.Caption = table.Columns[1].ColumnName;   //y轴的标题
        }

        //将类型字段保存到一个字符串变量,用"/t"分隔
        string typeString = "";
        foreach (DataRow row in table.Rows)
        {
            typeString += row[0].ToString() + "/t";
        }

        for (int i = 1; i < table.Columns.Count; i++)
        {
            //将值字段保存到一个字符串变量,用"/t"分隔
            string dataString = "";
            foreach (DataRow row in table.Rows)
            {
                dataString += row[i].ToString() + "/t";
            }
            //新建一个序列
            ChSeries series = chart.SeriesCollection.Add(0);
            series.Caption = table.Columns[i].ColumnName.ToString();
            //设置类型字段(x轴)的值
            series.SetData(ChartDimensionsEnum.chDimCategories, (int)ChartSpecialDataSourcesEnum.chDataLiteral, typeString);
            //设置值字段(y轴)的值
            series.SetData(ChartDimensionsEnum.chDimValues, (int)ChartSpecialDataSourcesEnum.chDataLiteral, dataString);
            //值标签
            if (showPointY)
            {
                series.DataLabelsCollection.Add().HasValue = true;
            }
        }
        //生成图表,并保存为图片
        this._chartSpace.ExportPicture(this._fullFileName, FILE_EXTEND, chartWidth, chartHeight);
    }

    /// <summary>
    /// 生成曲线图
    /// </summary>
    /// <param name="table">数据源,第一列为x座标,第二列及之后的列为Y轴上的数值</param>
    /// <param name="chartWidth">图表的宽度</param>
    /// <param name="chartHeight">图表的高度</param>
    /// <returns></returns>
    public void CreateSmoothLineChart(DataTable table, int chartWidth, int chartHeight)
    {
        this.CreateSmoothLineChart(table, true, false, chartWidth, chartHeight);
    }

    /// <summary>
    /// 生成曲线图
    /// </summary>
    /// <param name="table">数据源,第一列为x座标,第二列及之后的列为Y轴上的数值</param>
    /// <returns></returns>
    public void CreateSmoothLineChart(DataTable table)
    {
        this.CreateSmoothLineChart(table, true, false, DEFAULT_CHART_WIDTH, DEFAULT_CHART_HEIGHT);
    }
    #endregion

    public MemoryStream GetMemoryStream()
    {
        const int BUFFER_SIZE = 4096;
        MemoryStream memoryStream = new MemoryStream();
        using (FileStream fileStream = new FileStream(this._fullFileName, FileMode.Open))
        {
            using (BufferedStream bufferedStream = new BufferedStream(fileStream))
            {
                byte[] buffer = new byte[BUFFER_SIZE];
                int bufferLength;
                while ((bufferLength = bufferedStream.Read(buffer, 0, BUFFER_SIZE)) > 0)
                {
                    memoryStream.Write(buffer, 0, bufferLength);
                }
            }
        }
        return memoryStream;
        // MemoryStream memoryStream = new MemoryStream(System.IO.File.ReadAllBytes(this._fullFileName));
       
        //FileStream f = new FileStream(this._fullFileName, FileMode.Open);
        //MemoryStream memoryStream = new MemoryStream();
        //memoryStream.SetLength(f.Length);
        //f.Read(memoryStream.GetBuffer(), 0, (int)f.Length);         
    }
}

============================================

具体调用

        string fileName = @"F:/temp/" + DateTime.Now.ToString("yyyyMMddhhmmss") + ".xls";
        OwcExcelHelper excel = new OwcExcelHelper(fileName);
        excel.ExportToExcel(dataSet);
        MemoryStream memoryStream = excel.GetMemoryStream();

        Response.Clear();
        Response.AddHeader("Content-Disposition", "attachment; filename=" + System.Web.HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8));
        Response.AddHeader("Content-Length", memoryStream.Length.ToString());
        Response.ContentType = "application/vnd.ms-excel";
        //ms.WriteTo(Response.OutputStream);
        byte[] bytes = memoryStream.GetBuffer();
        Response.OutputStream.Write(bytes, 0, bytes.Length);
        Response.Flush();
        HttpContext.Current.Response.End();

==========================================

    private void CreateCharts()
    {
        DataTable table = this.GetDate();
        table.TableName = "渠道分析";
        table.Columns[0].ColumnName = "代理商";
        table.Columns[1].ColumnName = "销售金额";
        table.Columns[2].ColumnName = "成本金额";

        生成柱状图
        //string fileName1 = @"F:/temp/column_" + DateTime.Now.ToString("yyyyMMddhhmmss") + ".gif";
        //OwcChartHelper chart1 = new OwcChartHelper(fileName1);
        //chart1.CreateColumnChart(table, false, true, true, 1024, 800);     //柱状图
        //MemoryStream memoryStream1 = chart1.GetMemoryStream();
        //Response.ContentType = "image/gif";
        //Response.BinaryWrite(memoryStream1.ToArray());

        饼图
        //string fileName2 = @"F:/temp/pie_" + DateTime.Now.ToString("yyyyMMddhhmmss") + ".gif";
        //OwcChartHelper chart2 = new OwcChartHelper(fileName2);
        //chart2.CreatePieChart(table);     //柱状图
        //MemoryStream memoryStream2 = chart2.GetMemoryStream();
        //Response.ContentType = "image/gif";
        //Response.BinaryWrite(memoryStream2.ToArray());

        //曲线图
        string fileName3 = @"F:/temp/ling_" + DateTime.Now.ToString("yyyyMMddhhmmss") + ".gif";
        OwcChartHelper chart3 = new OwcChartHelper(fileName3);
        chart3.CreateSmoothLineChart(table);
        MemoryStream memoryStream3 = chart3.GetMemoryStream();     //柱状图
        Response.ContentType = "image/gif";
        Response.BinaryWrite(memoryStream3.ToArray());
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值