C# 操作Excel文档

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/beibeisong/article/details/53045091

最近做了个小项目,涉及到了数据导出到Excel文档,微软对Excel的接口操作基本全支持,主要通过阅读MSDN来完成的(可能有存在错误的地方,欢迎批评指正),现在汇总一下:

项目需要添加Microsoft.Office.Interop.Excel;

ApplicationClass--Excel应用程序、Workbook--工作簿、Worksheet--工作单、ChatObject--表格对象、Range--工作单中选中的范围

      基本方法:整数转换成Excel列

        private string IntToColumnName(int num)
        {
            string columnName = string.Empty;
            if (num <= 26)
            {
                columnName = ((char)('A' + num - 1)).ToString();
            }
            else
            {
                columnName = ((char)('A' + ((num-1) / 26 - 1))).ToString() + ((char)('A' + (num + 25) % 26)).ToString();
            }
            return columnName;
        }

       /// <summary>
        /// 添加工作表
        /// </summary>
        public void AddWorksheet()
        {
            if (worksheet != null)
            {
                this.workbook.Sheets.Add(paramMissing, worksheet, 1, XlSheetType.xlWorksheet);
            }
            else if (workbook != null)
            {
                this.workbook.Sheets.Add(paramMissing, paramMissing, 1, XlSheetType.xlWorksheet);
            }
        }

        /// <summary>
        /// 删除当前工作表
        /// </summary>
        public void DeleteWorksheet()
        {
            if (worksheet != null)
                this.worksheet.Delete();
        }

        /// <summary>
        /// 改变当前工作表
        /// </summary>
        /// <param name="sheetIndex">工作表编号</param>
        public void ChangeCurrentWorksheet(int sheetIndex)
        {
            if (sheetIndex < 1)
                return;
            if (sheetIndex > workbook.Sheets.Count)
                return;
            this.worksheet = (Worksheet)this.workbook.Sheets.get_Item(sheetIndex);
        }

        /// <summary>
        /// 改变工作表的名称
        /// </summary>
        /// <param name="sheetIndex">工作表编号</param>
        /// <param name="sheetName">工作表名称</param>
        public void ChangeWorksheetName(int sheetIndex, string sheetName)
        {
            if (sheetIndex < 1)
                return;
            if (sheetIndex > workbook.Sheets.Count)
                return;
            if (!string.IsNullOrEmpty(sheetName))
            {
                worksheet = (Worksheet)this.workbook.Sheets.get_Item(sheetIndex);
                worksheet.Name = sheetName;
            }
        }

        /// <summary>
        /// 设置指定单元格的文本
        /// </summary>
        /// <param name="rowIndex">行</param>
        /// <param name="columnIndex">列</param>
        /// <param name="text">文本</param>
        public void SetCell(int rowIndex, int columnIndex, string text)
        {
            try
            {
                worksheet.Cells[rowIndex, columnIndex] = text;
            }
            catch
            {
                //throw new Exception("向单元格[" + rowIndex + "," + columnIndex + "]写数据出错!");
            }
        }

      数组arr赋值给worksheet表单

       public Range ArrayToExcel(object[,] arr, int rowCount, int colCount, int top, int left)
        {
            string row = IntToColumnName(left) + top.ToString();
            string col = IntToColumnName(left + colCount - 1) + ((int)(rowCount + top-1)).ToString();
            Range range = null;
            try
            {
                range = worksheet.get_Range(row, col);
                range.Value2 = arr;
                range.Borders.LineStyle = 1;
                range.Borders.get_Item(XlBordersIndex.xlEdgeTop).LineStyle = Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous;
                //range.EntireColumn.AutoFit();
            }
            catch { }
            return range;
        }


       dataRange内的数据生成柱状图、折线图、饼状图到worksheet表单的指定位置

       /// <summary>
        /// 添加柱状图
        /// </summary>
        /// <param name="dataRange">数据范围</param>
        /// <param name="left">左端位置</param>
        /// <param name="top">顶端位置</param>
        /// <param name="width">宽度</param>
        /// <param name="height">高度</param>
        /// <param name="plotBy">x轴,1代表rows,2代表columns</param>
        /// <param name="chartTitle">图标题</param>
        /// <param name="categoryTitle">类别(x轴)标题</param>
        /// <param name="valueTitle">值(y轴)标题</param>
        /// <param name="layout">布局类别(1-7)</param>
        /// <returns></returns>
        public bool AddColumnChart(Range dataRange, double left, double top, double width, double height, int plotBy, string chartTitle, string categoryTitle, string valueTitle, int layout)
        {
            try
            {
                chartObjects = (ChartObjects)worksheet.ChartObjects(paramMissing);
                chartObj = chartObjects.Add(left, top, width, height);
                chartObj.Chart.ChartWizard(dataRange, XlChartType.xlColumnClustered, paramChartFormat, plotBy, paramCategoryLabels, paramSeriesLabels, paramHasLegend, chartTitle, categoryTitle, valueTitle, paramMissing);
                chartObj.Chart.ApplyLayout(layout, XlChartType.xlColumnClustered);
                return true;
            }
            catch
            {
                return false;
            }
        }

/// <summary>
        /// 添加折线图
        /// </summary>
        /// <param name="dataRange">数据范围</param>
        /// <param name="left">左端位置</param>
        /// <param name="top">顶端位置</param>
        /// <param name="width">宽度</param>
        /// <param name="height">高度</param>
        /// <param name="plotBy">x轴,1代表rows,2代表columns</param>
        /// <param name="chartTitle">图标题</param>
        /// <param name="categoryTitle">类别(x轴)标题</param>
        /// <param name="valueTitle">值(y轴)标题</param>
        /// <param name="layout">布局类别(1-7)</param>
        /// <returns></returns>
        public bool AddLineChart(Range dataRange, double left, double top, double width, double height, int plotBy, string chartTitle, string categoryTitle, string valueTitle,int layout)
        {
            try
            {
                chartObjects = (ChartObjects)worksheet.ChartObjects(paramMissing);
                chartObj = chartObjects.Add(left, top, width, height);
                chartObj.Chart.ChartWizard(dataRange, XlChartType.xlLine, paramChartFormat, plotBy, paramCategoryLabels, paramSeriesLabels, paramHasLegend, chartTitle, categoryTitle, valueTitle, paramMissing);//plotby
                chartObj.Chart.ApplyLayout(layout, XlChartType.xlLine);
                return true;
            }
            catch
            {
                return false;
            }
        }


/// <summary>
        /// 添加饼状图
        /// </summary>
        /// <param name="dataRange">数据范围</param>
        /// <param name="left">左端位置</param>
        /// <param name="top">顶端位置</param>
        /// <param name="width">宽度</param>
        /// <param name="height">高度</param>
        /// <param name="chartTitle">图标题</param>
        /// <param name="categoryTitle">类别(x轴)标题</param>
        /// <param name="valueTitle">值(y轴)标题</param>
        /// <param name="layout">布局类别(1-7)</param>
        /// <returns></returns>
        public bool AddPieChart(Range dataRange, double left, double top, double width, double height, int plotBy, string chartTitle, string categoryTitle, string valueTitle, int layout)
        {
            try
            {
                chartObjects = (ChartObjects)worksheet.ChartObjects(paramMissing);
                chartObj = chartObjects.Add(left, top, width, height);
                chartObj.Chart.ChartWizard(dataRange, XlChartType.xlPie, 0, plotBy, paramMissing, paramMissing, paramMissing, chartTitle, paramMissing, paramMissing, paramMissing);//plotby
                chartObj.Chart.HasTitle = true;
                chartObj.Chart.ApplyLayout(layout,XlChartType.xlPie);
                return true;
            }
            catch
            {
                return false;
            }
        }

猜你喜欢

转载自blog.csdn.net/beibeisong/article/details/53045091