--写入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循环详细解释如下:
-
外部循环(
for (int indexRow = 0; indexRow < dataSet.Tables[0].Rows.Count; indexRow++)
)遍历dataSet.Tables[0]
中的所有行。dataSet.Tables[0].Rows.Count
给出表中的行数。 -
内部循环(
for (int indexColumn = 0; indexColumn < dataSet.Tables[0].Columns.Count; indexColumn++)
)遍历当前行的所有列。dataSet.Tables[0].Columns.Count
给出表中的列数。 -
Range range = excel[indexRow + 2, indexColumn + 1];
这行代码创建了一个Range
对象,代表Excel工作表中的一个单元格。注意,这里的indexRow + 2
和indexColumn + 1
很可能是因为Excel的行和列索引是从1开始的,而程序中的数据集索引是从0开始的,所以需要进行调整以匹配Excel的索引。 -
range.Value2 = dataSet.Tables[0].Rows[indexRow][indexColumn];
这行代码将数据集中当前行列的值赋给Excel工作表中对应的单元格。 -
接下来的
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的控制台应用程序: