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

news2024/11/17 13:56:16
--写入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.coloradmin.cn/o/1642923.html

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

相关文章

QT:QT窗口(一)

文章目录 菜单栏创建菜单栏在菜单栏中添加菜单创建菜单项添加分割线 工具栏创建工具栏设置停靠位置创建工具栏的同时指定停靠位置使用QToolBar类提供的setAllowedAreas函数来设置停靠位置 设置浮动属性设置移动属性 状态栏状态栏的创建在状态栏中显示实时消息在状态栏中显示永久…

Meta Llama 3 使用 Hugging Face 和 PyTorch 优化 CPU 推理

原文地址&#xff1a;meta-llama-3-optimized-cpu-inference-with-hugging-face-and-pytorch 了解在 CPU 上部署 Meta* Llama 3 时如何减少模型延迟 2024 年 4 月 19 日 万众期待的 Meta 第三代 Llama 发布了&#xff0c;我想确保你知道如何以最佳方式部署这个最先进的&…

深入学习Redis(1):Redis内存模型

Redis的五个对象类型 字符串&#xff0c;哈希&#xff0c;列表&#xff0c;集合&#xff0c;有序集合 本节有关redis的内存模型 1.估算redis的内存使用情况 目前内存的价格比较的高&#xff0c;如果对于redis的内存使用情况能够进行计算&#xff0c;就可以选用合适的设备进…

Docker高频使用命令

一、Docker常用命令总结 1.镜像命令管理 指令描述ls列出镜像build构建镜像来自Dockerfilehoistory查看历史镜像inspect显示一个或多个镜像的详细信息pull从镜像仓库拉取镜像push推送一个镜像仓库rm移除一个或多个镜像prune一处未使用的镜像&#xff0c;没有被标记或被任何容器…

上位机图像处理和嵌入式模块部署(树莓派4b和qt应用全屏占有)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 我们都知道&#xff0c;嵌入式应用一般都是为了某一个特定应用而存在的。也就是说&#xff0c;和pc不同&#xff0c;这个嵌入式板子一般都是为了解…

Java之LinkedHashMap

系列文章目录 文章目录 系列文章目录前言前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 LinkedHashMap是Map接口的哈希表和链接列表实现,具有可预知的迭代顺序。…

【数学建模】矩阵微分方程

一、说明 我相信你们中的许多人都熟悉微分方程&#xff0c;或者至少知道它们。微分方程是数学中最重要的概念之一&#xff0c;也许最著名的微分方程是布莱克-斯科尔斯方程&#xff0c;它控制着任何股票价格。 ​​ 股票价格的布莱克-斯科尔斯模型 微分方程可以由数学中的许多…

正在载入qrc文件 指定的qrc文件无法找到。您想更新这个文件的位置么?

打开Qt的ui文件&#xff0c;弹出提示框 如果需要用到qrc文件&#xff0c;选择Yes&#xff0c;再选择qrc文件所在的位置&#xff1b;如果不需要qrc文件&#xff0c;可以选择No&#xff0c;然后用普通文本编辑器打开&#xff0c;将“ <resources> <include location&q…

去哪儿网机票服务请求体bella值逆向

作者声明&#xff1a;文章仅供学习交流与参考&#xff01;严禁用于任何商业与非法用途&#xff01;否则由此产生的一切后果均与作者无关&#xff01;如有侵权&#xff0c;请联系作者本人进行删除&#xff01; 一、加密定位 直接全局搜索bella&#xff0c;在可疑的地方下断&…

2024/5/5 英语每日一段

Meanwhile, in a twist, Tesla this month settled a high-profile case in Northern California that claimed Autopilot played a role in the fatal crash of an Apple engineer, Walter Huang. The company’s decision to settle with Huang’s family—along with a ruli…

数据结构学习/复习7--栈的实现/括号匹配/队列的实现/两个队列实现栈

一、栈 1.概念及性质 2.栈的实现(top0版) 注意事项&#xff1a;top也可初始为-1,代码需要调整 二、栈练习 1.括号匹配 三、队列 1.概念及性质 2.队列的实现 四、队列练习 1.两个队列实现栈

2024年 Java 面试八股文——SpringBoot篇

目录 1. 什么是 Spring Boot&#xff1f; 2. 为什么要用SpringBoot 3. SpringBoot与SpringCloud 区别 4. Spring Boot 有哪些优点&#xff1f; 5. Spring Boot 的核心注解是哪个&#xff1f;它主要由哪几个注解组成的&#xff1f; 6. Spring Boot 支持哪些日志框架&#…

10个使用NumPy就可以进行的图像处理步骤

图像处理是一种数学计算。数字图像由称为像素的彩色小点组成。每个像素由红、绿、蓝(RGB)三个独立的颜色组成。每个像素中的主色由每个RGB分量的数值决定。 本文将介绍10个使用使用NumPy就可以进行的图像处理步骤&#xff0c;虽然有更强大的图像处理库&#xff0c;但是这些简单…

数据结构-二叉树结尾+排序

一、二叉树结尾 1、如何判断一棵树是完全二叉树。 我们可以使用层序遍历的思路&#xff0c;利用一个队列&#xff0c;去完成层序遍历&#xff0c;但是这里会有些许的不同&#xff0c;我们需要让空也进队列。如果队列里到最后只剩下空那么这棵树就是完全二叉树。具体的实现如下…

【Flask 系统教程 2】路由的使用

Flask 是一个轻量级的 Python Web 框架&#xff0c;其简洁的设计使得构建 Web 应用变得轻而易举。其中&#xff0c;路由是 Flask 中至关重要的一部分&#xff0c;它定义了 URL 与视图函数之间的映射关系&#xff0c;决定了用户请求的处理方式。在本文中&#xff0c;我们将深入探…

关于安装Tensorflow的一些操作及问题解决

关于conda和tensorflow&#xff1a; 由于在安装tensorflow遇到各种问题&#xff0c;遇坑则进&#xff0c;耗费了很多时间。由此想整理一些关于安装tensorflow的操作和方法。欢迎各位补充和指正&#xff01; 1.conda: 1&#xff09;conda list 查看安装了哪些包。 2&#xff…

OpenCV人脸识别C++代码实现Demo

OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉库&#xff0c;它提供了很多函数&#xff0c;这些函数非常高效地实现了计算机视觉算法。 官网&#xff1a;https://opencv.org/ Github: https://github.com/opencv/opencv Gitcode…

如何打包Apk适配32和64位

一个表格了解lib下的文件夹 .so文件描述armeabi-v7a第七代及以上的ARM处理器&#xff0c;2011年以后生产的大部分Android设备都使用。arm64-v8a第8代、64位ARM处理器&#xff0c;很少设备&#xff0c;三星GalaxyS6是其中之一。armeabi第5代、第6代的ARM处理器&#xff0c;早期…

C语言数据结构之队列

目录 1.队列的概念及结构2.队列的实现逻辑3.队列的代码实现4.相关例题选择题 •͈ᴗ•͈ 个人主页&#xff1a;御翮 •͈ᴗ•͈ 个人专栏&#xff1a;C语言数据结构 •͈ᴗ•͈ 欢迎大家关注和订阅!!! 1.队列的概念及结构 队列&#xff1a;只允许在一端进行插入数据操作&#x…

Ubuntu系统安装nvfortran详细步骤【笔记】

实践设备&#xff1a;华硕FX-PRO&#xff08;NVIDIA GeForce GTX 960M&#xff09; Ubuntu系统安装NVFORTRAN&#xff08;NVIDIA Fortran Compiler&#xff09;步骤如下&#xff1a; 安装依赖项&#xff1a;在安装NVFORTRAN之前&#xff0c;你需要确保系统已经安装了一些必要…