C# 操作Excel的多种方式

        在项目开发过程和办公过程中,经常要遇到对Excel进行创建,读写等操作,excel太多师,整理也成了一大难题。通过程序对excel进行整理能快速提供开发和办公效率。

Excel操作几种方式

  • 使用OleDb(过时)
  • 使用Microsoft.Office.Interop.Excel COM组件(兼容性问题)
  • 使用开源库NPOI(常用,操作丰富)
  • 使用OpenXml(效率高)
使用OleDb

通过OleDb操作excel需要安装AccessDatabaseEngine组件,对Excel文件的格式有一定的限制,不支持一些特定的Excel功能。性能可能不如其他方法,比较老旧,基本不用。

       string excelFilePath = "D:\\Test\\test.xlsx";private void OpenExcelByOleDb(){string connectionString = $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={excelFilePath};Extended Properties='Excel 12.0;HDR=YES;'";using (OleDbConnection connection = new OleDbConnection(connectionString)){try{connection.Open();Console.WriteLine("链接成功!");// 获取Excel文件中第一个工作表的数据string query = "SELECT * FROM [Sheet1$]";using (OleDbCommand command = new OleDbCommand(query, connection))using (OleDbDataReader reader = command.ExecuteReader()){while (reader.Read()){// 假设第一列是字符串,第二列是整数string stringValue = reader.GetString(0);int intValue = reader.GetInt32(1);Console.WriteLine($"String value: {stringValue}, Integer value: {intValue}");}}}catch (Exception ex){Console.WriteLine($"错误: {ex.Message}");}}}
Microsoft.Office.Interop.Excel

通过Microsoft.Office.Interop.Excel COM组件操作Excel可以实现对Excel文件的高度控制,支持复杂的Excel操作。但对资源的管理需要谨慎处理,易造成资源泄漏且兼容性不高。

        string excelFilePath = "D:\\Test\\test.xlsx";private void OpenExcelByInteropExcel(){// 创建Excel应用程序对象Excel.Application excelApp = new Excel.Application();excelApp.Visible = true; // 可见Excel应用程序界面// 打开Excel文件Excel.Workbook workbook = excelApp.Workbooks.Open(excelFilePath);Excel.Worksheet worksheet = workbook.Sheets[1] as Excel.Worksheet;// 读取或写入数据Excel.Range range = worksheet.UsedRange;for (int row = 1; row <= range.Rows.Count; row++){for (int column = 1; column <= range.Columns.Count; column++){// 处理单元格数据var cellValue = range.Cells[row, column].Value;Console.WriteLine(cellValue.ToString());//range.Cells[row, column].Value = 1;}}#region 保存模板//object Nothing = System.Reflection.Missing.Value;//Microsoft.Office.Interop.Excel.Workbook workbook1 = excelApp.Workbooks.Add(Nothing);//Microsoft.Office.Interop.Excel.Worksheet worksheet1 = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Sheets["Sheet2"];//打开Sheet2//worksheet1.Copy(workbook1.Sheets["Sheet1"], Type.Missing);//复制模板Sheet1内容//workbook.Close(false, Type.Missing, Type.Missing);//workbook1.SaveAs("modelpath", Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);//workbook1.Close(false, Type.Missing, Type.Missing);#endregion// 释放资源workbook.Close(false);excelApp.Quit();System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);}
使用开源库NPOI

使用开源库NPOI操作Excel跨平台,不依赖于Microsoft Office,适用于在服务器端等环境中操作Excel文件。支持读取和写入Excel文件,并提供了丰富的API。但对于复杂的Excel操作,不如COM组件灵活,无法实现一些高级功能。Nuget引用NPOI组件。

  string excelFilePath = "D:\\Test\\test.xlsx";private void OpenExcelByNPOI(){// 读取Excel文件using (FileStream fs = new FileStream(excelFilePath, FileMode.Open, FileAccess.Read)){IWorkbook workbook = new XSSFWorkbook(fs);ISheet sheet = workbook.GetSheetAt(0);// 遍历每一行for (int row = 0; row <= sheet.LastRowNum; row++){IRow currentRow = sheet.GetRow(row);if (currentRow != null) // 确保行不为空{// 遍历每一列for (int column = 0; column < currentRow.LastCellNum; column++){ICell currentCell = currentRow.GetCell(column);if (currentCell != null) // 确保单元格不为空{// 处理单元格数据var cellValue = currentCell.ToString();Console.WriteLine(cellValue);}}}}}}
使用OpenXml

使用OpenXml操作Excel,它直接对文件流进行操作,而无需将整个文档加载到内存中,无需安装 Microsoft Office,非常适合服务器端应用程序和批处理。Nuget引用DocumentFormat.OpenXml 组件。

        string excelFilePath = "D:\\Test\\test.xlsx";private void OpenExcelByOpenXml(){//流式传输文件,性能高using (SpreadsheetDocument doc = SpreadsheetDocument.Open(excelFilePath, false)){WorkbookPart workbookPart = doc.WorkbookPart;Sheet sheet = workbookPart.Workbook.Sheets.GetFirstChild<Sheet>();WorksheetPart worksheetPart = (WorksheetPart)workbookPart.GetPartById(sheet.Id);OpenXmlReader reader = OpenXmlReader.Create(worksheetPart);while (reader.Read()){if (reader.ElementType == typeof(DocumentFormat.OpenXml.Spreadsheet.Row)){DocumentFormat.OpenXml.Spreadsheet.Row row = (DocumentFormat.OpenXml.Spreadsheet.Row)reader.LoadCurrentElement();foreach (DocumentFormat.OpenXml.Spreadsheet.Cell cell in row.Elements<DocumentFormat.OpenXml.Spreadsheet.Cell>()){string cellValue = GetCellValue(doc, cell);Console.Write(cellValue + " ");}Console.WriteLine();}}}}/// <summary>/// OpenXml获取单元格值/// 流式传输/// </summary>/// <param name="doc"></param>/// <param name="cell"></param>/// <returns></returns>private static string GetCellValue(SpreadsheetDocument doc, DocumentFormat.OpenXml.Spreadsheet.Cell cell){SharedStringTablePart stringTablePart = doc.WorkbookPart.SharedStringTablePart;string value = cell.CellValue.InnerXml;if (cell.DataType != null && cell.DataType.Value == CellValues.SharedString){return stringTablePart.SharedStringTable.ChildElements[Int32.Parse(value)].InnerText;}else{return value;}}

Excel与DatagridView之间操作

Excel文件导入DateGridView
  /// <summary>/// Excel导入DataGridView/// </summary>/// <param name="excelFilePath"></param>/// <param name="dataGridView"></param>public static void ImportExcelToDataGridView(string excelFilePath, DataGridView dataGridView){Excel.Application excelApp = new Excel.Application();Excel.Workbook workbook = excelApp.Workbooks.Open(excelFilePath);Excel.Worksheet worksheet = workbook.Sheets[1];Range usedRange = worksheet.UsedRange;for (int i = 1; i <= usedRange.Columns.Count; i++){DataGridViewColumn column = new DataGridViewColumn();column.Name = "Column" + i;column.HeaderText = "Column" + i;column.CellTemplate = new DataGridViewTextBoxCell();dataGridView.Columns.Add(column);}dataGridView.Rows.Clear();for (int i = 1; i <= usedRange.Rows.Count; i++){DataGridViewRow row = new DataGridViewRow();for (int j = 1; j <= usedRange.Columns.Count; j++){row.Cells.Add(new DataGridViewTextBoxCell());row.Cells[j - 1].Value = usedRange.Cells[i, j].Value;}dataGridView.Rows.Add(row);}workbook.Close();excelApp.Quit();System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheet);System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);worksheet = null;workbook = null;excelApp = null;GC.Collect();}
DateGridView导出Excel文件
        /// <summary>/// Datagridview导出excel/// </summary>/// <param name="fileName"></param>/// <param name="myDGV"></param>private void DatagridViewToExcel( DataGridView myDGV){string saveFileName = "";SaveFileDialog saveDialog = new SaveFileDialog();saveDialog.DefaultExt = "xls";saveDialog.Filter = "Excel文件|*.xls";if(saveDialog.ShowDialog()==DialogResult.Cancel){return;}saveFileName = saveDialog.FileName;if (saveFileName.IndexOf(":") < 0) return; //被点了取消Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();if (xlApp == null){MessageBox.Show("无法创建Excel对象,可能您的机子未安装Excel");return;}Microsoft.Office.Interop.Excel.Workbooks workbooks = xlApp.Workbooks;Microsoft.Office.Interop.Excel.Workbook workbook = workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1];//取得sheet1//写入标题for (int i = 0; i < myDGV.ColumnCount; i++){worksheet.Cells[1, i + 1] = myDGV.Columns[i].HeaderText;}//写入数值for (int r = 0; r < myDGV.Rows.Count; r++){for (int i = 0; i < myDGV.ColumnCount; i++){worksheet.Cells[r + 2, i + 1] = myDGV.Rows[r].Cells[i].Value;}System.Windows.Forms.Application.DoEvents();}worksheet.Columns.EntireColumn.AutoFit();//列宽自适应if (saveFileName != ""){try{workbook.Saved = true;workbook.SaveCopyAs(saveFileName);}catch (Exception ex){MessageBox.Show("导出文件时出错,文件可能正被打开!\n" + ex.Message);}}xlApp.Quit();GC.Collect();//强行销毁MessageBox.Show("文件: " + saveFileName + ".xls 保存成功", "信息提示",MessageBoxButtons.OK, MessageBoxIcon.Information);}

CSV与DatagridView之间操作

csv文件导入DateGridView
        /// <summary>/// 将csv文件数据导入datagridview/// </summary>/// <param name="csvPath"></param>/// <returns></returns>public static void ImportCSV(DataGridView dgv){string filePath;OpenFileDialog openFileDialog = new OpenFileDialog();openFileDialog.Filter = "CSV files (*.csv)|*.csv";openFileDialog.FilterIndex = 0;if (openFileDialog.ShowDialog() == DialogResult.OK){filePath = openFileDialog.FileName;}else{return;}System.Data.DataTable dt = new System.Data.DataTable();using (StreamReader sr = new StreamReader(filePath)){string[] headers = sr.ReadLine().Split(',');string headerValue = null;foreach (string header in headers){headerValue = header.Replace("\"", "");dt.Columns.Add(headerValue);}while (!sr.EndOfStream){string[] rows = sr.ReadLine().Split(',');DataRow dr = dt.NewRow();for (int i = 0; i < headers.Length; i++){dr[i] = rows[i].Replace("\"", "");}dt.Rows.Add(dr);}}dgv.DataSource = dt;}
DateGridView导出csv文件
       /// <summary>/// DateGridView导出到csv格式的Excel,通用  /// </summary>/// <param name="dgv"></param>public static void ExportToCSV(DataGridView dgv){string filePath;SaveFileDialog saveFileDialog = new SaveFileDialog();saveFileDialog.Filter = "CSV files (*.csv)|*.csv";saveFileDialog.FilterIndex = 0;if (saveFileDialog.ShowDialog() == DialogResult.OK){filePath = saveFileDialog.FileName;}else{return;}using (StreamWriter sw = new StreamWriter(filePath)){// 写入列标题string headers = string.Join(",", dgv.Columns.Cast<DataGridViewColumn>().Select(column => "\"" + column.HeaderText + "\"").ToArray());sw.WriteLine(headers);// 写入数据行foreach (DataGridViewRow row in dgv.Rows){string line = string.Join(",", row.Cells.Cast<DataGridViewCell>().Select(cell => "\"" + cell.Value?.ToString().Replace("\"", "\"\"") + "\"").ToArray());sw.WriteLine(line);}}}

实例链接:https://download.csdn.net/download/lvxingzhe3/89977285

参考:

C# EXCEL创建,编辑,导出,按模板保存以及Excel与 DataGridView互转_c#创建excel文件-CSDN博客

C#NPOI应用(导入导出Excel)_c# npoi 操作excel-CSDN博客

使用 C# 和 OpenXML 读取大型 Excel 文件_openxml excel c#-CSDN博客

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

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

相关文章

网络管理之---3种网络模式配置

目标&#xff1a; 了解几个概念&#xff1a; 1.什么是IP&#xff1f;什么是IP地址&#xff1f; 2.什么是桥接、NAT、仅主机模式 3.端口&#xff1f; 4.什么是网络接口命名规则 5.网络管理器 IP&#xff1a;指网络之间互联的协议&#xff0c;是TCP/IP 体系中的网络协议 I…

uniapp解析蓝牙设备响应数据bug

本文章为了解决《uniapp 与蓝牙设备收发指令详细步骤(完整项目版)》中第十步的Array 解析成 number函数bug 1、原代码说明 function array16_to_number(arrayValue) {const newArray arrayValue.filter(item > String(item) ! 00 || String(item) ! 0)const _number16 ne…

【测试框架篇】单元测试框架pytest(3):用例执行参数详解

一、前言 上一篇内容介绍了用例编写的规则以及执行用例&#xff0c;执行用例时我们发现有些print输出内容&#xff0c;结果没有给我们展示&#xff0c;这是因为什么原因呢&#xff1f;接下来我们会针对这些问题进行阐述。 二、参数大全 我们可以在cmd中通过输入 pytest -h 或…

再见 阿里巴巴EasyExcel替代品EasyExcel-Plus即将诞生

最近阿里发布公告通知&#xff0c;停止对EasyExcel 更新和维护&#xff0c;EasyExcel 是一款知名的 Java Excel 工具库&#xff0c;由阿里巴巴开源&#xff0c;作者是玉霄&#xff0c;在 GitHub 上有 30k stars、7.5k forks。 据了解&#xff0c;EasyExcel作者玉霄)去年已经从…

VBA08-if语句

一、单行 If 语句 If x > 10 Then MsgBox "x is greater than 10"二、多行 If...Then...End If 语句 If x > 10 ThenMsgBox "x is greater than 10"y x 5 End If 三、If...Then...Else 语句 If condition Then 当条件为真时执行的代码块stateme…

闯关leetcode——202. Happy Number

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/happy-number/description/ 内容 Write an algorithm to determine if a number n is happy. A happy number is a number defined by the following process: Starting with any positive inte…

Apache Kylin 添加MSSQL等第三方数据源(MySQL 亦可)

Apache Kylin 添加MSSQL等数据源 Kylin 版本要求是3 PS&#xff1a;根据Kylin文档kylin 4.0和kylin 3.1的区别中所示&#xff1a; Kylin 3.1.0 支持 Kafka/Hive/JDBC 作为数据源Kylin 4.0 支持 Hive/CSV 作为数据源 官方文档请参考:Setup JDBC Data Source 第三方文档参考…

工位管理优化:Spring Boot企业级系统

3系统分析 3.1可行性分析 通过对本企业级工位管理系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本企业级工位管理系统采用SSM框架&#xff0c;JAVA作为开…

java双向链表解析实现双向链表的创建含代码

双向链表 一.双向链表二.创建MyListCode类实现双向链表创建一.AddFirst创建&#xff08;头插法&#xff09;二.AddLast创建&#xff08;尾叉法&#xff09;三.size四.remove(指定任意节点的首位删除)五.removeAll(包含任意属性值的所有删除)六.AddIndex(给任意位置添加一个节点…

flink 同步oracle11g数据表到pg库

1. 关闭防火墙和selinux systemctl stop firewalld systemctl disable firewalld systemctl status firewalldvi /etc/selinux/config 修改为disabled2.安装java8 yum list java-1.8* yum install java-1.8.0-openjdk* -yjava -version3.下载和部署postgresql 看需求安装pg库…

用接地气的例子趣谈 WWDC 24 全新的 Swift Testing 入门(三)

概述 从 WWDC 24 开始&#xff0c;苹果推出了全新的测试机制&#xff1a;Swift Testing。利用它我们可以大幅度简化之前“老态龙钟”的 XCTest 编码范式&#xff0c;并且使得单元测试更加灵动自由&#xff0c;更符合 Swift 语言的优雅品味。 在这里我们会和大家一起初涉并领略…

Vue 2 —Vue Router 页面导航和参数传递

当从A页面跳转到B页面的时候把数据也一起传递过去&#xff0c;可用Vue Router 功能&#xff1a; 一、. this.$router.push 方法 Vue Router 是 Vue.js 的官方路由管理器&#xff0c;允许你在应用中进行页面导航&#xff08;即跳转到不同的 URL 路径&#xff09;。 this.$rout…

【AI声音克隆整合包及教程】第二代GPT-SoVITS V2:技术、应用与伦理思考

一、引言 在当今科技迅速发展的时代&#xff0c;声音克隆技术成为人工智能领域的一个备受瞩目的分支。GPT-SoVITS V2作为一种声音克隆工具&#xff0c;正逐渐进入人们的视野&#xff0c;它在多个领域展现出巨大的潜力&#xff0c;同时也引发了一系列值得深入探讨的问题。本文旨…

ssm092基于Tomcat技术的车库智能管理平台+jsp(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;车库智能管理平台设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本车库智能管理平台…

11 Oracle Golden Gate 高可用解决方案:Golden Gate 助力企业保障业务连续性

文章目录 Oracle Golden Gate 高可用解决方案&#xff1a;Golden Gate 助力企业保障业务连续性一、Oracle Golden Gate基本概念二、设计异地灾备策略2.1 需求分析2.2 网络规划2.3 部署架构 三、实施异地灾备策略3.1 环境准备3.2 配置Golden Gate3.3 验证与测试 四、数据保护策略…

【NLP】使用 PyTorch 从头构建自己的大型语言模型 (LLM)

读完这篇文章后&#xff0c;你会取得什么成就&#xff1f;你将能够自己构建和训练大型语言模型 (LLM)&#xff0c;同时与我一起编写代码。虽然我们正在构建一个将任何给定文本从英语翻译成马来语的 LLM&#xff0c;但你可以轻松地修改此 LLM 架构以用于其他语言翻译任务。 LLM…

绘制3D图

一个 3D 函数的表面图&#xff0c;其中包含向量场。 Python 代码示例&#xff0c;使用 matplotlib 和 numpy 库来绘制类似的图。 python 复制代码 import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D# 生成网格 x np.linspace(-…

MATLAB实战 利用1D-DCGAN生成光谱或信号数据

0.前言 在光谱学或信号处理领域&#xff0c;获取大量高质量的数据可能是一项挑战。利用DCGAN迁移对抗生成光谱或信号数据&#xff0c;可以有效地增加数据集的多样性&#xff0c;提高模型的泛化能力。 该实战项目提供了所有源代码与测试数据&#xff0c;旨在帮助学者快速地掌握了…

华为:hcia综合实验

一、拓扑图 二、实验要求 1. pc地址请自行规划&#xff0c;vlan已给出 2. 服务器地址自行规划&#xff0c;vlan&#xff0c;网段已给出 3. 交换机互联链路捆绑保证冗余性 4. 内网pc网关集中于核心交换机&#xff0c;交换机vlan 40互联路由器 ,地址网段已给出 5.配置静态路由实…

jenkins流水线pipeline

创建项目 1. 新建item 并选择pipeline 1.1 和普通项目配置的区别 普通项目配置目录&#xff1a; pipeline项目目录&#xff1a; pipeline的两种语法 声明式语法 2. 配置 2.1 流水线配置 2.2 选择声明式 声明式需要添加一个名为Jenkinsfile的文件实现流水线 Jenkinsfile的…