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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

理解Linux文件系统

文章目录 一、引言二、Linux文件系统概述1、文件系统的结构2、文件系统目录树的逻辑结构 二、文件系统的特性1、super block&#xff1a;文件系统的超级块2、inode&#xff1a;文件系统的索引节点3、inode table4、block&#xff1a;文件系统的数据块5、块组描述符表&#xff0…

QT:核心控件-QWidget

文章目录 控件enableobjectNamegeometrysetWindowTitleopacitycursorFonttooltipstyleSheet 控件 什么是控件&#xff1f; 如上所示&#xff0c;就是控件&#xff0c;而本篇要做的就是对于这些控件挑选一些比较有用的常用的进行讲解分析 在QT的右侧&#xff0c;会有对应的空间…

第 8 章 机器人平台设计(自学二刷笔记)

重要参考&#xff1a; 课程链接:https://www.bilibili.com/video/BV1Ci4y1L7ZZ 讲义链接:Introduction Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 学习到当前阶段大家对ROS已经有一定的认知了&#xff0c;但是之前的内容更偏理论&#xff0c;尤其是介绍完第6…

ccpc热身赛题目1:中文系Roliy的困惑

代码 import java.util.ArrayList; import java.util.Scanner;public class Main {public static void main(String[] args) {ArrayList<String> list new ArrayList<>();char [] charArr new char[32];for (int i 0; i < charArr.length; i) {charArr[i] 0…

python 怎么调用R

如何在python中调用R&#xff1f;这其中包括了如何调用R的对象&#xff08;函数和包&#xff09;&#xff0c;R和python的对象如何互相转换&#xff0c;以及如何调用R的脚本&#xff08;外界参数的输入&#xff09;。python提供了一个模块rpy2&#xff0c;可以较好地完成这项工…

RCE学习(一)

一.知识点 RCE&#xff1a;远程命令/代码执行漏洞&#xff0c;简称为RCE漏洞&#xff0c;可以直接向服务器后台远程注入操作系统的命令或者代码&#xff0c;从而拿到服务器后台的权限。RCE分为远程执行命令&#xff08;执行ping命令&#xff09;和远程代码执行eval 简单来说就…

Python-Socket编程实现tcp-udp通信

本文章是记录我准备大创项目时学的socket编程的用法&#xff0c;纯属记录生活&#xff0c;没有教学意义&#xff0c;视频我是看b站up主王铭东学的&#xff0c;讲的很详细&#xff0c;我只粗略学了个大概&#xff0c;我想要通过tcp&#xff0c;udp传输yolo目标检测中的物体坐标信…

java面试(微服务)

SpringCloud五大组件 Nacos&#xff1a;注册中心Ribbon&#xff1a;负载均衡Feign&#xff1a;远程调用sentinel&#xff1a;服务熔断Gateway&#xff1a;网关 注册中心 Eureka Nacos 负载均衡 Ribbon负载均衡流程 Ribbon的负载均衡策略 RoundRobinRule&#xff1a;简单的…

分类预测 | MATLAB实现LSSVM最小二乘支持向量机多分类预测

分类预测 | MATLAB实现LSSVM最小二乘支持向量机多分类预测 目录 分类预测 | MATLAB实现LSSVM最小二乘支持向量机多分类预测分类效果基本介绍程序设计参考资料分类效果 基本介绍 MATLAB实现LSSVM最小二乘支持向量机多分类预测。最小二乘支持向量机(Least Squares Support Vecto…

网络应用层之(6)L2TP协议详解

网络应用层之(6)L2TP协议 Author: Once Day Date: 2024年5月1日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文档可参考专栏&#xff1a;通信网络技术_Once-Day的…

python算法题

需求 代码 class Solution:def searchInsert(self, nums: List[int], target: int) -> int:if max(nums) >target:for i in range(len(nums)-1):if nums[i1] > target and nums[i] <target:return i1if max(nums) <target:return len(nums)if min(nums) > …

kubectl_入门_Pod控制器

Pod控制器 在k8s中&#xff0c;按照pod的创建方式可以将其分为两类 自主式pod&#xff1a;k8s直接创建出来的pod&#xff0c;这种pod删除后就没有了&#xff0c;也不会重建控制器创建的pod&#xff1a;通过控制器创建的pod&#xff0c;这种pod删除了之后还会自动重建 1. 什么…

【docker 】 push 镜像提示:denied: requested access to the resource is denied

往 Docker Registry &#xff08;私服&#xff09;push 镜像提示&#xff1a;denied: requested access to the resource is denied 镜像push 语法&#xff1a;docker push <registry-host>:<registry-port>/<repository>:<tag> docker push 192.16…

C语言 | Leetcode C语言题解之第61题旋转链表

题目&#xff1a; 题解&#xff1a; struct ListNode* rotateRight(struct ListNode* head, int k) {if (k 0 || head NULL || head->next NULL) {return head;}int n 1;struct ListNode* iter head;while (iter->next ! NULL) {iter iter->next;n;}int add n…

第12章 软件测试基础(第一部分)概念、质量保证、测试用例、测试执行过程

一、软件测试 &#xff08;一&#xff09;定义 动态验证计算机程序对有限的测试用例集是否可产生期望的结果的过程。测试计划是描述了要进行的测试活动的范围、方法、资源和进度的文档。编写测试计划目的&#xff1a;使测试工作顺利进行、使项目参与人员沟通更舒畅、使测试工…

操作系统:线程

目录 前言&#xff1a; 1.线程 1.1.初识线程 1.2.“轻量化”进程 1.3.线程与进程 2.线程控制 2.1.pthread原生线程库 2.2.线程控制的接口 2.2.1.线程创建 2.2.线程退出|线程等待|线程分离|线程取消 2.3.pthread库的原理 2.4.语言和pthread库的关系 2.5.线程局部…

redis核心数据结构——跳表项目设计与实现(跳表结构介绍,节点类设计,随机层级函数)

跳表结构介绍。跳表是redis等知名软件的核心数据结构&#xff0c;其实现的前提是有序链表&#xff0c;思想的本质是在原有一串存储数据的链表中&#xff0c;间隔地抽出一半元素作为上一级链表&#xff0c;并将抽提出的元素和原先的位置相关联&#xff0c;这样重复下去直到最上层…

Android AOSP探索之Ubantu下Toolbox的安装

文章目录 概述安装Toolbox解决运行的问题 概述 由于最近需要进军android的framework,所以需要工具的支持&#xff0c;之前听说江湖上都流传source insight,我去弄了一个破解版&#xff0c;功能确实强大&#xff0c;但是作为多年android开发的我习惯使用android studio。虽然使…

数据分析及AI技术在旅游行业的应用

引言 旅游行业是一个充满潜力和机遇的领域&#xff0c;而数据分析和人工智能&#xff08;AI&#xff09;技术的迅猛发展为这个行业带来了前所未有的机遇和挑战。本文将探讨数据分析及AI技术在旅游行业中的具体应用及其带来的影响。 数据分析在旅游行业的4种应用 在旅游行业…

【开源设计】京东慢SQL组件:sql-analysis

京东慢SQL组件&#xff1a;sql-analysis 一、背景二、源码简析三、总结 地址&#xff1a;https://github.com/jd-opensource/sql-analysis 一、背景 开发中&#xff0c;无疑会遇到慢SQL问题&#xff0c;而常见的处理思路都是等上线&#xff0c;然后由监控报警之后再去定位对应…