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的控制台应用程序:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/6636.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

队列集使用

文章目录 前言一、功能描述二、功能实现 前言 在实际使用中我们可能要从多个队列中得到数据&#xff0c;就需要队列集。 一、功能描述 创建两个队列Queue1、Queue2。Task1往Queue1写数据、Task2往Queue2写数据。Task3使用QueueSet监测这两个队列。 二、功能实现 创建两个队列…

ArcGIS软件:地图投影的认识、投影定制

这一篇博客介绍的主要是如何在ArcGIS软件中查看投影数据&#xff0c;如何定制投影。 1.查看地图坐标系、投影数据 首先我们打开COUNTIES.shp数据&#xff08;美国行政区划图&#xff09;&#xff0c;并点击鼠标右键&#xff0c;再点击数据框属性就可以得到以下的界面。 我们从…

活动图与状态图:UML中流程图的精细化表达——专业解析系统动态性与状态变迁

流程图是一种通用的图形表示法&#xff0c;用以展示步骤、决策和循环等流程控制结构。它通常用于描述算法、程序执行流程或业务过程&#xff0c;关注于任务的顺序执行。流程图强调顺序、分支和循环&#xff0c;适用于详细说明具体的处理步骤&#xff0c;图形符号相对基础和通用…

Android NDK开发——Android Studio 3.5.2安装与配置踩坑

Android NDK开发——Android Studio 3.5.2安装与配置踩坑 一、Android Studio下载二、配置踩坑报错1&#xff1a;Failed to install the following Android SDK packages as some licences have not been accepted报错2&#xff1a;No toolchains found in the NDK toolchains …

C语言实战项目--贪吃蛇

贪吃蛇是久负盛名的游戏之一&#xff0c;它也和俄罗斯⽅块&#xff0c;扫雷等游戏位列经典游戏的行列。在编程语言的教学中&#xff0c;我们以贪吃蛇为例&#xff0c;从设计到代码实现来提升大家的编程能⼒和逻辑能⼒。 在本篇讲解中&#xff0c;我们会看到很多陌生的知识&…

Unity 性能优化之数据面板(Statistics)(一)

提示&#xff1a;仅供参考&#xff0c;有误之处&#xff0c;麻烦大佬指出&#xff0c;不胜感激&#xff01; 文章目录 前言一、unity 统计数据面板&#xff08;Statistics&#xff09;1.Audio属性2.Graphics属性 二、什么是Draw Call&#xff1f;三、Unity3D stats也可以通过代…

OpenCV的周期性噪声去除滤波器(70)

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇:OpenCV如何通过梯度结构张量进行各向异性图像分割(69) 下一篇 :OpenCV如何为我们的应用程序添加跟踪栏(71) 目录 目标 理论 如何消除傅里叶域中的周期性噪声&#xff1f; 源代码 解释 结果 目…

设计模式之数据访问对象模式

在Java编程的浩瀚星海中&#xff0c;有一个模式低调却强大&#xff0c;它像是一位默默无闻的超级英雄&#xff0c;支撑起无数应用的数据脊梁——那就是数据访问对象&#xff08;DAO, Data Access Object&#xff09;模式&#xff01;想象一下&#xff0c;如果你能像操纵魔法一样…

Unity技术学习:RenderMesh、RenderMeshInstanced

叠甲&#xff1a;本人比较菜&#xff0c;如果哪里不对或者有认知不到的地方&#xff0c;欢迎锐评&#xff08;不玻璃心&#xff09;&#xff01; 导师留了个任务&#xff0c;渲染大量的、移动的物体。 当时找了几个解决方案&#xff1a; 静态批处理&#xff1a; 这东西只对静…

golang for经典练习 金字塔打印 示例 支持控制台输入要打印的层数

go语言中最经典的for练习程序 金字塔打印 &#xff0c;这也是其他语言中学习循环和条件算法最为经典的联系题。 其核心算法是如何控制内层循环变量j 每行打印的*号数量 j<i*2-1 和空格数量 j1 || j i*2-1 golang中实现实心金字塔 Solid Pyramid和空心金字塔 Hollow Pyram…

CSS浮动(如果想知道CSS有关浮动的知识点,那么只看这一篇就足够了!)

前言&#xff1a;在学习CSS排版的时候&#xff0c;浮动是我们必须要知道的知识点&#xff0c;浮动在设计之初是为了实现文字环绕效果的&#xff0c;但是后来被人们发现浮动在CSS排版中有着很好的实用价值&#xff0c;所以浮动便成为了CSS排版的利器之一。 ✨✨✨这里是秋刀鱼不…

pandas学习笔记12

缺失数据处理 其实在很多时候&#xff0c;人们往往不愿意过多透露自己的信息。假如您正在对用户的产品体验做调查&#xff0c;在这个过程中您会发现&#xff0c;一些用户很乐意分享自己使用产品的体验&#xff0c;但他是不愿意透露自己的姓名和联系方式&#xff1b; 还有一些用…

《尿不湿级》STM32 F103C8T6最小系统板搭建(五)BOOT

一、BOOT是什么&#xff1f; 大多数初学者第一次接触BOOT总是对这个词感到不解&#xff0c;从哪冒出一个奇奇怪怪的东西还要接跳线帽&#xff0c;为什么要配置它才能进行串口程序的下载&#xff1f;为什么不正确配置会导致单片机无法正常启动…… boot&#xff0c;及物动词&…

AI-数学-高中56-成对数据统计-线性回归方程

原作者视频&#xff1a;【成对数据统计】【一数辞典】1线性回归方程_哔哩哔哩_bilibili 注意&#xff1a;高中只学线性回归。 最小二乘法&#xff08;残差和平方最小的直线、方差最小>拟合程度最好&#xff09;&#xff1a;

2.spring security 简单入门

创建springboot 项目&#xff0c;引入spring security坐标 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--spring security坐标--><dependency&g…

17_Scala面向对象高阶功能

文章目录 1.继承1.1 构造对象时,父类对象优于子类对象1.2父类主构造有参数,子类必须要显示地调用父类主构造器并传值 2.封装3.抽象3.1抽象定义3.2子类继承抽象类3.3抽象属性 4.伴生对象4.1创建类和伴生对象4.2调用 1.继承 –和Java一样,权限protected , public.父类定义子类用…

分布式锁之-redis

什么是分布式锁&#xff1f; 即分布式系统中的锁。在单体应用中我们通过锁解决的是控制共享资源访问的问题&#xff0c;而分布式锁&#xff0c;就是解决了分布式系统中控制共享资源访问的问题。与单体应用不同的是&#xff0c;分布式系统中竞争共享资源的最小粒度从线程升级成了…

详细介绍ARM-ORACLE Database 19c数据库下载

目录 1. 前言 2. 获取方式 2.1 ORACLE专栏 2.2 ORACLE下载站点 1. 前言 现有网络上已有非常多关于ORACLE数据库机下载的介绍&#xff0c;但对于ARM平台的介绍不多&#xff0c;借此机会我将该版的下载步骤做如下说明&#xff0c;希望能够一些不明之人提供帮助和参考 2. 获…

Linux理解文件操作 文件描述符fd 理解重定向 dup2 缓冲区 C语言实现自己的shell

文章目录 前言一、文件相关概念与操作1.1 open()1.2 close()1.3 write()1.4 read()1.4 写入的时候先清空文件内容再写入1.5 追加&#xff08;a && a&#xff09; 二、文件描述符2.1 文件描述符 fd 0 1 2 的理解2.2 FILE结构体&#xff1a;的源代码 三、深入理解文件描述…

DETR类型检测网络---思考和Tricks测试

目录 batch_size的影响辅助损失的作用学习率的影响Decoder层数增多的影响3D检测中, feats位置编码和query位置编码是否共享mpl层背景-关于query的生成方式 利用widthformer类似的方式简化注意力机制 batch_size的影响 batch8: batch20: 由实验结果可知:这里实验有问题,横坐标…