当前位置: 代码网 > it编程>编程语言>C# > C#操作Excel的多种方式小结

C#操作Excel的多种方式小结

2024年11月25日 C# 我要评论
在项目开发过程和办公过程中,经常要遇到对excel进行创建,读写等操作,excel太多师,整理也成了一大难题。通过程序对excel进行整理能快速提供开发和办公效率。excel操作几种方式使用oledb

在项目开发过程和办公过程中,经常要遇到对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);
               }
           }
       }

到此这篇关于c#操作excel的多种方式小结的文章就介绍到这了,更多相关c#操作excel内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

  • 使用C#校验画布签名图片是否为空白

    使用C#校验画布签名图片是否为空白

    需求分析我的文章《c# winform实现画笔签名及解决memorybmp格式问题》主要介绍如何通过 c# winform 通过画布画笔实现手写签名,签名后的图... [阅读全文]
  • C# NModbus RTU通信实现方法详解

    modbus协议时应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络/串口和其它设备之间可以进行通信。它已经成为了一种工业标准。有了这个通信协议,不同的厂…

    2024年11月25日 编程语言
  • C#中桥接模式的具体使用

    C#中桥接模式的具体使用

    在软件开发中,我们经常会遇到需要应对多维度变化的场景,比如在一个图形应用程序中,我们需要支持不同的图形形状(如圆形、方形)以及不同的渲染方式(如矢量图、光栅图)... [阅读全文]
  • C# 单例模式的多种实现方式

    C# 单例模式的多种实现方式

    单例模式介绍单例模式是一种创建型设计模式,它主要确保在一个类只有一个实例,并提供一个全局访问点来获取该实例。在c#中,有多种方式实现单例模式,每种方式都有其特定... [阅读全文]
  • 通过C#代码轻松提取PDF文本

    通过C#代码轻松提取PDF文本

    pdf格式因其跨平台兼容性强、安全性高等特点而被广泛使用。但pdf文档不易编辑,因此提取pdf文档的文本从而进行操作是一个常见的需求。提取pdf中的文本可以帮助... [阅读全文]
  • C#中高精度计时器Stopwatch的用法详解

    C#中高精度计时器Stopwatch的用法详解

    引言偶然发现c# 的计时器类stopwatch,他特别适合测量运行时间,使用简单、计时精确。它源于命名空间system.diagnostics,使用时必须usi... [阅读全文]

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com