C# 操作Excel的多种方式

news2024/11/16 23:00:01

        在项目开发过程和办公过程中,经常要遇到对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.coloradmin.cn/o/2241801.html

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

相关文章

Ubuntu 的 ROS 2 操作系统 turtlebot3 gazebo仿真

引言 TurtleBot3 Gazebo仿真环境是一个非常强大的工具&#xff0c;能够帮助开发者在虚拟环境中测试和验证机器人算法。 Gazebo是一个开源的3D机器人仿真平台&#xff0c;它能支持物理引擎&#xff0c;允许机器人在虚拟环境中模拟和测试。结合ROS&#xff0c;它能提供一个完整的…

前后端交互之动态列

一. 情景 在做项目时&#xff0c;有时候后会遇到后端使用了聚合函数&#xff0c;导致生成的对象的属性数量或数量不固定&#xff0c;因此无法建立一个与之对应的对象来向前端传递数据&#xff0c;这时可以采用NameDataListVO向前端传递数据。 Data Builder AllArgsConstructo…

json转excel,读取json文件写入到excel中【rust语言】

一、rust代码 将json文件写入到 excel中。&#xff08;保持json &#xff1a;key原始顺序&#xff09; 可执行程序: 「json2excel.exe」 链接&#xff1a;https://pan.quark.cn/s/fe851c86c659 use indexmap::IndexMap; use serde::Deserialize; use serde_json::{Value,…

【python系列】python数据类型之数字类型

1.定义 数字类型是编程中最常用的数据类型。什么是数字类型&#xff0c;下面是数字类型官方文档的解释&#xff1a;https://docs.python.org/zh-cn/3.10/library/stdtypes.html?highlightstr%20join#numeric-types-int-float-complex 以上可以知道&#xff1a; 数字类型包…

[Redis] Redis服务集群

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

LLaMA-Factory全流程训练模型

&#x1f917;本文主要讲述在docker下使用LLaMA-Factory训练推理模型。 &#x1fae1;拉取镜像 首先需要启动docker&#xff0c;然后在终端中输入&#xff1a; docker run -tid --gpus all -p 8000:8000 --name LLM -e NVIDIA_DRIVER_CAPABILITIEScompute,utility -e NVIDIA…

计算机组成原理对于学习嵌入式开发的意义

计算机组成原理对于学习嵌入式开发的意义 前言 最近有位同学向我咨询&#xff0c;问学习嵌入式开发需不需要学习硬件&#xff1f;进而引申到了需不需要学习计算机组成原理呢&#xff1f; 正文 首先计算机组成原理是计算机科学与技术专业的一门核心基础课程&#xff0c;它深入…

Python学习从0到1 day27 Python 高阶技巧 ③ 设计模式 — 单例模式

此去经年&#xff0c;再难同游 —— 24.11.11 一、什么是设计模式 设计模式是一种编程套路&#xff0c;可以极大的方便程序的开发最常见、最经典的设计模式&#xff0c;就是我们所学习的面向对象了。 除了面向对象外,在编程中也有很多既定的套路可以方便开发,我们称之为设计模…

算法---解决“汉诺塔”问题

# 初始化步骤计数器 i 1 # 定义移动盘子的函数 def move(n, mfrom, mto): global i # 使用全局变量i来跟踪步骤 print("第%d步:将%d号盘子从%s->%s" % (i, n, mfrom, mto)) # 打印移动步骤 i 1 # 步骤计数器加1 #第一种方法 # 定义汉诺塔问题的递归…

2024游戏陪玩app源码的功能介绍/线上陪玩交友上线即可运营软件平台源码搭建流程

一个完整的陪玩交友系统从概念到实现再到维护的全过程得以清晰展现。每一步都需要团队的紧密协作与细致规划&#xff0c;以确保系统既满足用户需求&#xff0c;又具备良好的稳定性和可扩展性。 基础框架 移动端开发框架&#xff1a;如uniapp&#xff0c;它支持多平台开发&…

AGI自学分享,简单有用的理论与实践

开始必备 谷歌邮箱 没有谷歌邮箱简直“寸步难行”。 GitHub Build and ship software on a single, collaborative platform GitHub GitHub上有所有开源项目的源代码&#xff0c;当然还有许许多多资源的分享。 huggingface huggingface上的space可以试用许多模型demo&a…

基于stm32的智能变频电冰箱系统

基于stm32的智能变频电冰箱系统 持续更新&#xff0c;欢迎关注!!! 基于stm32的智能变频电冰箱系统 随着集成电路技术的发展&#xff0c;单片微型计算机的功能也不断增强&#xff0c;许多高性能的新型机种不断涌现出来。单片机以其功能强、体积小、可靠性高、造价低和开发周期短…

[OpenGL]使用OpenGL实现透明效果

一、简介 本文介绍了如何使用OpenGL实现透明效果&#xff08;transparent&#xff09;&#xff0c;并在最后给出了全部的代码。 在实现透明效果时&#xff0c;使用OpenGL中的混合&#xff08;Blend&#xff09;功能&#xff0c;根据纹理贴图的 alpha 分量将各像素&#xff08;…

ABAP关于PS模块CJ20N中项目物料的屏幕和字段增强CI_RSADD

网上搜关于CJ20N的屏幕增强,基本都是关于项目定义(CI_PROJ)、项目WBS(CI_PRPS)、项目网络活动工序(CI_AFVU)的字段与屏幕增强,几乎没有关于项目物料(CI_RSADD)的字段屏幕增强,我在这里做一个分享。 主要逻辑:实现badi增强,并自建一个函数组后创建屏幕,在badi里面调用…

Android setTheme设置透明主题无效

【问题现象】 1、首先&#xff0c;你在AndroidManifest.xml中声明一个activity&#xff0c;不给application或者activity设置android:theme, 例如这样&#xff1a; <applicationandroid:allowBackup"true"android:icon"mipmap/ic_launcher"android:lab…

windows下git和TortoiseGit(小乌龟)和putty安装配置对github进行操作

本次安装版本如下&#xff1a; 1&#xff0c;先下载安装tortoiseGit一路下载安装即可一直到在桌面上右键可以看到有git的选项出现为止&#xff0c;注意在第一步的时候选择使用putty还是ssh建立网络连接决定后面的步骤&#xff0c;本次以选择putty为例。 2&#xff0c;安装git&a…

Flutter:input输入框

输入框&#xff1a; // 是否显示关闭按钮 bool _showClear false; // 文字编辑控制器&#xff0c;监听搜索框的变化。 final TextEditingController _controller TextEditingController(); // 输入框发生变化事件 void _onChange(String value){if(value.length > 0){setS…

Ubuntu相关指令

1、查看 Ubuntu 系统的版本信息&#xff0c;在终端输入&#xff1a; lsb_release -a该命令会输出类似如下的信息&#xff1a; No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.4 LTS Release: 22.04 Codename: jammy 在 Re…

Unity教程(十八)战斗系统 攻击逻辑

Unity开发2D类银河恶魔城游戏学习笔记 Unity教程&#xff08;零&#xff09;Unity和VS的使用相关内容 Unity教程&#xff08;一&#xff09;开始学习状态机 Unity教程&#xff08;二&#xff09;角色移动的实现 Unity教程&#xff08;三&#xff09;角色跳跃的实现 Unity教程&…

【软件测试】设计测试用例的方法(正交法、判定表法、错误猜测法),测试文档的写法

文章目录 正交法正交表设计正交表 判定表法判定表 设计测试用例的步骤 错误猜测法测试文档 正交法 正交试验设计(Orthogonal experimentaldesign)是研究多因素多⽔平的⼀种设计⽅法&#xff0c;它是根据正交性&#xff0c;由试验因素的全部⽔平组合中挑选出部分有代表性的点进…