c#&Excel:2.写入Excel表 3.读取Excel表

--写入Excel表--

该例首先从数据库aq中读取学生信息表staq(参考数据库章节),然后将学生信息表中的数据写入Excel表格中

(1)在OfficeOperator类库项目的ExcelOperator类中定义索引器,用于获取Excel表格中的单元格,代码如下:
public Range this[object indexRow, object indexColumn]
     {
         get { return ExcelWorksheet.Cells[indexRow, indexColumn]; }    //返回指定单元格
     }

using Microsoft.Office.Interop.Excel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace OfficeOperator2
{
    public class ExcelOperator
    {
        public Application ExcelApplication;           //Excel应用对象
        public Workbook ExcelWorkbook;                 //Excel工作簿对象
        public Worksheet ExcelWorksheet;               //Excel工作表对象
        public ExcelOperator()//声明用于操作Excel的对象,并定义其构造函数
        {
            ExcelApplication = new Application();      //创建Application对象
          //  ExcelApplication.Visible = true;           //创建完成后是否打开Excel
        }
        /// <summary>
        /// 创建Excel表格
        /// </summary>
        public void CreateExcel()
        {
            ExcelWorkbook = ExcelApplication.Workbooks.Add(true);          //添加工作簿
            ExcelWorksheet = ExcelWorkbook.Worksheets[1] as Worksheet;     //获取工作表
        }
        /// <summary>
        /// 保存Excel表格
        /// </summary>
        /// <param name="fileName"></param>
        public void SaveExcel(string fileName)
        {
            ExcelApplication.DisplayAlerts = false;                //设置禁止弹出保存询问提示框
            ExcelApplication.AlertBeforeOverwriting = false;       //设置禁止弹出覆盖询问提示框
            object FileName = fileName;                            //需要保存Excel文件的名称
            object Password = "";                                  //打开Excel文档密码,少于16位
            object WriteResPassword = "";                          //修改Excel文档密码,小于16位
            object ReadOnlyRecommended = false;                    //Excel以只读形式打开是否提示
            object CreateBackup = false;                           //是否创建备份
            ExcelWorkbook.SaveAs(FileName, Missing.Value, Password, WriteResPassword, ReadOnlyRecommended, CreateBackup, XlSaveAsAccessMode.xlNoChange);
        }
        /// <summary>
        /// 退出Excel应用
        /// </summary>
        public void QuitExcel()
        {
            ExcelApplication.Quit();                               //退出Excel应用
        }
        /// <summary>
        /// 获取Excel表格中的单元格
        /// </summary>
        /// <param name="indexRow"></param>
        /// <param name="indexColumn"></param>
        /// <returns></returns>
        public Range this[object indexRow, object indexColumn]
        {
            get { return ExcelWorksheet.Cells[indexRow, indexColumn]; }    //返回指定单元格
        }
    }
    }

(2)将数据库中的学生信息表写入Excel表格中,并进行统计。在CreateExcel项目中的main函数中添加代码如下:
SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM student_info",
     "Data Source=.\\SQLEXPRESS;Initial Catalog=student;Integrated Security=True");
     DataSet dataSet = new DataSet();
     adapter.Fill(dataSet);                                             //填充数据集
     string[] fields = new string[]{"  学号  ","姓名","年龄","年级","成绩","性别"};
     //为学生信息表添加列名
     for (int indexColumn = 0; indexColumn < dataSet.Tables[0].Columns.Count; indexColumn++)
     { Range range = excel[1, indexColumn + 1];
         range.Value2 = fields[indexColumn];
     }
             //把学生信息表写入Excel中
        for (int indexRow = 0; indexRow < dataSet.Tables[0].Rows.Count; indexRow++)
        {
            for (int indexColumn = 0; indexColumn < dataSet.Tables[0].Columns.Count;
indexColumn++)
            {
                Range range = excel[indexRow + 2, indexColumn + 1];
                range.Value2 = dataSet.Tables[0].Rows[indexRow][indexColumn];
                if (indexColumn == 4 && range.Value2 < 60)              //标记不合格的学生成绩
                    range.Interior.ColorIndex = 6;
            }
        }

嵌套的for循环详细解释如下:

  1. 外部循环(for (int indexRow = 0; indexRow < dataSet.Tables[0].Rows.Count; indexRow++))遍历dataSet.Tables[0]中的所有行。dataSet.Tables[0].Rows.Count给出表中的行数。

  2. 内部循环(for (int indexColumn = 0; indexColumn < dataSet.Tables[0].Columns.Count; indexColumn++))遍历当前行的所有列。dataSet.Tables[0].Columns.Count给出表中的列数。

  3. Range range = excel[indexRow + 2, indexColumn + 1]; 这行代码创建了一个Range对象,代表Excel工作表中的一个单元格。注意,这里的indexRow + 2indexColumn + 1很可能是因为Excel的行和列索引是从1开始的,而程序中的数据集索引是从0开始的,所以需要进行调整以匹配Excel的索引。

  4. range.Value2 = dataSet.Tables[0].Rows[indexRow][indexColumn]; 这行代码将数据集中当前行列的值赋给Excel工作表中对应的单元格。

  5. 接下来的if语句检查当前处理的列是否是第5列(即indexColumn == 4,因为索引从0开始),并且该单元格的值(学生成绩)是否小于60。如果两个条件都满足,那么执行range.Interior.ColorIndex = 6;,将单元格的背景色设置为黄色(在Excel中,颜色索引6通常对应黄色)。

(3)统计学生信息表中学生的平均年龄、平均年级和平均成绩。在CreateExcel项目的main函数中添加代码如下:
Range rangeAverage = excel[22, 1];
     rangeAverage.Value2 = "平均值";
     Range rangeAge = excel[22, 3];
     rangeAge.Formula = "=AVERAGE(C2:C21)";                     //计算平均年龄
     Range rangeGrade = excel[22, 4];
     rangeGrade.Formula = "=AVERAGE(D2:D21)";                   //计算平均年级
     Range rangeResult = excel[22, 5];
     rangeResult.Formula = "=AVERAGE(E2:E21)";                  //计算数据成绩

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OfficeOperator2;
using Microsoft.Office.Interop.Excel;
using System.Data.SqlClient;
using System.Data;

namespace CreateExcel
{
    internal class Program
    {
        static void Main(string[] args)
        {
            ExcelOperator excel = new ExcelOperator();                    //创建Excel操作者
            excel.CreateExcel();                       //创建Excel表格

      //将数据库中的学生信息表写入Excel表格中,并进行统计-------
            SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM staq_info",
     "Data Source=.\\SQLEXPRESS;Initial Catalog=aq;Integrated Security=True");
            DataSet dataSet = new DataSet();
            adapter.Fill(dataSet);                                             //填充数据集
            string[] fields = new string[] { "  学号  ", "姓名",  "年级", "成绩", "年龄", "性别" };
            //为学生信息表添加列名
            for (int indexColumn = 0; indexColumn < dataSet.Tables[0].Columns.Count; indexColumn++)
            {
                Range range = excel[1, indexColumn + 1];
                range.Value2 = fields[indexColumn];
            }
            //把学生信息表写入Excel中
            for (int indexRow = 0; indexRow < dataSet.Tables[0].Rows.Count; indexRow++)
            {
                for (int indexColumn = 0; indexColumn < dataSet.Tables[0].Columns.Count;
    indexColumn++)
                {
                    Range range = excel[indexRow + 2, indexColumn + 1];
                    range.Value2 = dataSet.Tables[0].Rows[indexRow][indexColumn];
                    if (indexColumn == 3 && range.Value2 < 60)              //标记不合格的学生成绩
                        range.Interior.ColorIndex = 6;
                }
            }//-----

            //统计学生信息表中学生的平均年龄、平均年级和平均成绩----
            Range rangeAverage = excel[22, 1];
            rangeAverage.Value2 = "平均值";
            Range rangeAge = excel[22, 3];
            rangeAge.Formula = "=AVERAGE(C2:C21)";                     //计算平均年龄
            Range rangeGrade = excel[22, 4];
            rangeGrade.Formula = "=AVERAGE(D2:D21)";                   //计算平均年级
            Range rangeResult = excel[22, 5];
            rangeResult.Formula = "=AVERAGE(E2:E21)";                  //----计算数据成绩



            excel.SaveExcel(Directory.GetCurrentDirectory() + "\\测试表格.xlsx");    //保存Excel表格
            excel.QuitExcel();             //退出Excel应用
        }
    }
}

 启动CreateExcel控制台应用程序:创建保存了一个带数据的Excel文档

 

--读取Excel表--

首先打开当前目录下的Excel表格,然后逐行读取Excel表格中的数据,最后将读取的数据输出到控制台窗口

(1)在OfficeOperator2项目的ExcelOperator类中定义打开Excel表格的函数OpenExcel,代码如下:
public void OpenExcel(string fileName)
     {
         ExcelWorkbook = ExcelApplication.Workbooks.Open(fileName);    //打开Excel表格
         ExcelWorksheet = ExcelWorkbook.Worksheets[1] as Worksheet;    //获取工作表
     } 

(2)创建一个名为OpenExcel的控制台应用程序,为其添加对项目OfficeOperator2的引用。在其main函数中添加代码:

    ExcelOperator excel = new ExcelOperator();          //创建Excel操作对象
    excel.OpenExcel(Directory.GetCurrentDirectory() + "\\测试表格.xlsx");//打开Excel表格
    int indexRow = 1;
    int indexColumn = 1;
    Range range = excel[indexRow, indexColumn];         //获取Excel中指定的单元格
    while (range.Value2 != null)
    {//遍历行
        while (range.Value2 != null)
        {//遍历列
            Console.Write(range.Value2 + "\t");           //输出单元格中的内容
            range = excel[indexRow, ++indexColumn];
        }
     indexColumn = 1;
    range = excel[++indexRow, indexColumn];
    Console.WriteLine();
    }
excel.QuitExcel();

 启动OpenExcel的控制台应用程序:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值