要使用OpenXml首先要下载最新的Open XML Format SDK 2.0。具体的导入openxml的dll,去网上搜,很多

1.我个人写的XmlHelp类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Data;
using System.Text;
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;

namespace CreateExcelSpreadsheet
{
  public  class ExcelHelper
    {

        /// <summary>
        /// 获取指定单元格的值
        /// </summary>
        /// <param name="cell">单元格</param>
        /// <param name="stringTablePart">SharedStringTablePart类型</param>
        /// <returns></returns>
        public static string GetValue(Cell cell, SharedStringTablePart stringTablePart)
        {
            string returnStr = string.Empty;
            try
            {
                if (cell.ChildElements.Count == 0)
                    return null;
                returnStr = cell.CellValue.InnerText;
                if ((cell.DataType != null) && (cell.DataType == CellValues.SharedString))
                    returnStr = stringTablePart.SharedStringTable.ChildElements[Int32.Parse(returnStr)].InnerText;
            }
            catch (Exception ex) {
                //returnStr = ex.Message;
                throw ex;
            }
            return returnStr;
        }

       /// <summary>
       /// 获取指定的行
       /// </summary>
       /// <param name="worksheet"></param>
       /// <param name="rowIndex">行号</param>
       /// <returns></returns>
       public static Row GetRow(WorkbookPart workBook,Worksheet worksheet,int rowIndex)
       {
            return worksheet.GetFirstChild<SheetData>().
              Elements<Row>().Where(r => r.RowIndex == rowIndex).First();
       }

      /// <summary>
      /// 根据行,列获取指定的单元格
      /// </summary>
      /// <param name="worksheet"></param>
      /// <param name="rowIndex">行号</param>
      /// <param name="columnName">列名</param>
      /// <returns></returns>
      public static Cell GetCell(WorkbookPart workBook,Worksheet worksheet, int rowIndex, string columnName)
      {
            Row row = GetRow(workBook,worksheet, rowIndex);

            if (row == null)
                return null;

            return row.Elements<Cell>().Where(c => string.Compare
                   (c.CellReference.Value, columnName +
                   rowIndex, true) == 0).First();
        }

      /// <summary>
      /// 给指定的单元格赋值
      /// </summary>
      /// <param name="cell"></param>
      /// <param name="newValue">所要赋值的数据</param>
      public static string SetValue(Cell cell, object newValue)
      {
            string returnStr = string.Empty;
            try
            {
                CellValue v = new CellValue(newValue.ToString());
                cell.CellValue = v;
            }
            catch (Exception ex) {
                //returnStr = ex.Message;
                throw ex;
            }
            return returnStr;
        }

      /// <summary>
      /// 更新指定行,列的单元格的值
      /// </summary>
      /// <param name="workSheet"></param>
      /// <param name="newValue">所要赋值的数据</param>
      /// <param name="rowIndex">行号</param>
      /// <param name="columnName">列名</param>
      public static string SetValue(WorkbookPart workBook, Worksheet workSheet, object newValue, int rowIndex, string columnName)
      {
          string returnStr = string.Empty;
          try{
              Cell cell = GetCell(workBook,workSheet, rowIndex, columnName);
            cell.CellValue = new CellValue(newValue.ToString());
            cell.DataType = new EnumValue<CellValues>(CellValues.Number);
            workSheet.Save();
           }catch(Exception ex){
              //returnStr = ex.Message;
               throw ex;
           }
           return returnStr;
        }

      /// <summary>
      /// 提起Worksheet的指定Row 作为DataTable的列名
      /// </summary>
      /// <param name="dt"></param>
      /// <param name="workSheet"></param>
      /// <param name="row"></param>
      public static string GetDataTableColumn(ref DataTable dt,WorkbookPart workBook,Worksheet worksheet,Row row)
      {
          string returnStr = string.Empty;
          try
          {
              DataColumn dc = new DataColumn();
              // SharedStringTable  sst = workbookPart.SharedStringTablePart.SharedStringTable ;
              foreach (Cell cell in row)
              {
                  string cellValue = GetValue(cell, workBook.SharedStringTablePart);
                  dc = new DataColumn(cellValue);
                  dt.Columns.Add(dc);
              }
          }
          catch (Exception ex) {
              //returnStr = ex.Message;
              throw ex;
          }
          return returnStr;
      }

      /// <summary>
      /// 把Worksheet中的数据一行一行的加进DataTable中
      /// </summary>
      /// <param name="dt"></param>
      /// <param name="worksheet"></param>
      /// <param name="row"></param>
      public static string GetDataTableRow(ref DataTable dt,WorkbookPart workBook,Worksheet worksheet,Row row) {
          string returnStr = string.Empty;
          try
          {
              DataRow dr = dt.NewRow();
              int i = 0;
              foreach (Cell cell in row)
              {
                  string cellValue = GetValue(cell, workBook.SharedStringTablePart);
                  dr[i++] = cellValue;
              }
              dt.Rows.Add(dr);
          }
          catch (Exception ex) {
              //returnStr = ex.Message;
              throw ex;
          }
          return returnStr;
      }

      /// <summary>
      /// 读取Excel的Sheet页到DataTable,默认Sheet的第一行是列名
      /// </summary>
      /// <param name="workSheet"></param>
      /// <returns></returns>
      public static string GetDataTableBySheet(ref DataTable dt,WorkbookPart workBook, Worksheet workSheet)
      {
          string returnStr = string.Empty;
          try
          {
              IEnumerable<Row> rows = workSheet.Descendants<Row>();
              foreach (Row row in rows)
              {
                  if (row.RowIndex == 1)
                  {    //默认Sheet的第一行是列名
                      GetDataTableColumn(ref dt, workBook, workSheet, row);
                  }
                  else
                  {
                      GetDataTableRow(ref dt, workBook, workSheet, row);   //更新除列名(第一行)以外的其他数据
                  }
              }
          }
          catch (Exception ex) {
              //returnStr = ex.Message;
              throw ex;
          }
          return returnStr;
      }

      /// <summary>
      /// 更新Worksheet中与DataTable相同的列
      /// </summary>
      /// <param name="dt">传入的DataTable的值</param>
      /// <param name="workSheet"></param>
      public static string UpdateDataFromDataTable(DataTable dt, WorkbookPart workBook, Worksheet workSheet)
      {
          string returnStr = string.Empty;
          try
          {
              int i = 0;  //workSheet的Row
              int j = 0;  //dt.Rows的Row
              foreach (Row row_ws in workSheet){
                  i++;
                  Cell cell_workSheet = GetCell(workBook,workSheet,i,"ID");
                  string cell_workSheet_value = GetValue(cell_workSheet,workBook.SharedStringTablePart) ;
                  foreach (DataRow row_dt in dt.Rows) {
                      j++;
                      if (cell_workSheet_value == row_dt["ID"].ToString()) {
                          SetValue(workBook,workSheet,row_dt["Name"],i,"Name");
                      }
                  }
              }
          }
          catch (Exception ex) {
              returnStr = ex.Message;
          }
          return returnStr;
      }

    }
}

  

2.具体应用例子

 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;

 using DocumentFormat.OpenXml;
 using DocumentFormat.OpenXml.Wordprocessing;
 using DocumentFormat.OpenXml.Packaging;
 using DocumentFormat.OpenXml.Spreadsheet;
 using DocumentFormat.OpenXml.Extensions;
 using CreateExcelSpreadsheet;

 namespace ConsoleApplication3
 {
     class Program
     {
         static void Main(string[] args)
         {
             using (SpreadsheetDocument spreedSheet = SpreadsheetDocument.Open(@"F:\test.xlsx", true)) {

                 WorkbookPart workBook = spreedSheet.WorkbookPart;
                 //自动计算
                 spreedSheet.WorkbookPart.Workbook.CalculationProperties.ForceFullCalculation = true;
                 spreedSheet.WorkbookPart.Workbook.CalculationProperties.FullCalculationOnLoad = true;

                 IEnumerable<Sheet> sheetXlsx = spreedSheet.WorkbookPart.Workbook.Descendants<Sheet>().Select(c=>c);
                 )
                 {
                     Console.WriteLine("Sheet页为空");
                 }
                 else {
                     //先去第一个Sheet做测试
                     WorksheetPart worksheetPart = workBook.WorksheetParts.FirstOrDefault();
                    // WorksheetPart worksheetPart = (WorksheetPart)spreedSheet.WorkbookPart.GetPartById(sheetXlsx.First().Id);
                     Worksheet workWheet = worksheetPart.Worksheet;
                     ExcelHelper.SetValue(workWheet, , "C");
                 }
             }
         }

     }
 }

以上代码简单明了,但是有个问题,就是,由于excel需要设置的属性很多,在使用OpenXml的时候,难免会后漏掉设置的属性,这样在用程序修改或者创建

excel后,第一次打开的时候,会弹出如下的消息,excel会自动补全确实的属性,目前我还没找到完美的解决方案,在随后会奉上

OpenXml操作Excel的更多相关文章

  1. 使用DocumentFormat.OpenXml操作Excel文件.xlsx

    1.开始 DocumentFormat.OpenXml是ms官方给一个操作office三大件新版文件格式(.xlsx,.docx,.pptx)的组件:特色是它定义了OpenXml所包含的所有对象(たぶ ...

  2. C# - openxml 操作excel - '“System.IO.Packaging.Package”在未被引用的程序集中定义'

    在 CodeProject中,有位网友写的一篇基于OpenXML SDK 2.0对excel(大数据量)进行操作,其中,运行的时候,有如下错误: 类型“System.IO.Packaging.Pack ...

  3. 使用OpenXml操作Excel,以下方法用于在添加列时修改Cell的CellReference属性。

    以下方法实现了递增Excel中单元格的CellReference的功能,只支持两位字母. public static string CellReferenceIncrement(string cell ...

  4. Open XML操作Excel导入数据

    项目中发现使用OleDb(using System.Data.OleDb)相关对象处理Excel导入功能,不是很稳定经常出问题,需要把这个问题解决掉.项目组提出使用OpenXML来处理Excel的导入 ...

  5. C# 操作 Excel 常见问题收集和整理(定期更新,欢迎交流)

    经常会有项目需要把表格导出为 Excel 文件,或者是导入一份 Excel 来操作,那么如何在 C# 中操作 Excel 文件成了一个最基本的问题. 做开发这几年来,陆陆续续也接触过这样的需求,但因为 ...

  6. 使用OpenXML将Excel内容读取到DataTable中

    前言:前面的几篇文章简单的介绍了如何使用OpenXML创建Excel文档.由于在平时的工作中需要经常使用到Excel的读写操作,简单的介绍下使用 OpenXML读取Excel中得数据.当然使用Open ...

  7. 转-C# 操作 Excel 常见问题收集和整理

    经常会有项目需要把表格导出为 Excel 文件,或者是导入一份 Excel 来操作,那么如何在 C# 中操作 Excel 文件成了一个最基本的问题. 做开发这几年来,陆陆续续也接触过这样的需求,但因为 ...

  8. C# 操作 Excel 常见问题收集和整理

    C# 操作 Excel 常见问题收集和整理(定期更新,欢迎交流) 经常会有项目需要把表格导出为 Excel 文件,或者是导入一份 Excel 来操作,那么如何在 C# 中操作 Excel 文件成了一个 ...

  9. C#使用oledb操作excel文件的方法

    本文实例讲述了C#使用oledb操作excel文件的方法.分享给大家供大家参考.具体分析如下: 不管什么编程语言都会提供操作Excel文件的方式,C#操作Excel主要有以下几种方式: 1.Excel ...

随机推荐

  1. Flask & Vue 构建前后端分离的应用

    Flask & Vue 构建前后端分离的应用 最近在使用 Flask 制作基于 HTML5 的桌面应用,前面写过<用 Python 构建 web 应用>,借助于完善的 Flask ...

  2. jenkins启动脚本

    [root@localhost system]# cat /etc/init.d/jenkins #!/bin/sh # # SUSE system statup script for Jenkins ...

  3. [转]Work With Odata in Web API: Create Your First Odata Service

    本文转自:http://www.c-sharpcorner.com/UploadFile/dacca2/work-with-odata-in-web-api-create-your-first-oda ...

  4. windows 下配置ndk环境,无需cygwin

    时隔好久要用ndk编译jni库,本以为配制安装cygwin环境,便按部就班的下载安装,但是公司的网速真的不给力,三天安装了三四次都没有安装成功(我选择的是在线安装),于是我便开始查ndk的官网看看,发 ...

  5. 樹莓派3B運行.Net Core2.1 Web 項目

    安裝.Net Core 運行時和SDK(非必選) 下載地址 安裝 # 安裝運行時 sudo apt-get -y update # Install the packages necessary for ...

  6. Maven --- <distributionManagement>标签

    1.<distributionManagement>的作用: 负责管理构件的发布.这是一个环境变量    <downloadUrl> URL </downloadUrl& ...

  7. SpringBoot加载子模块配置文件的方法

    这两天开始学习SpringBoot框架,按照官方的文档,很轻易地就把单模块的项目启动了,但在使用maven搭建多模块的时候遇到了子模块配置文件没有加载的问题 项目架构是这样的 zero |-ws |- ...

  8. HTTP状态码302、303、307区别

    HTTP状态码3XX表示重定向,表明浏览器需要执行某些特殊的处理以正确处理请求. 301 Moved Permanently 永久性定向.该状态码表示请求的资源已被分配了新的URI,以后应使用资源现在 ...

  9. 如何实现Docker应用的自定义弹性伸缩

    简介 现在有很多客户很关心应用的自动弹性伸缩,有些客户也有自己的监控框架,并希望能跟阿里云容器服务进行集成.阿里云容器服务提供了服务弹性伸缩触发器,并能够跟监控框架集成来实现自定义的服务自动弹性伸缩. ...

  10. Android学习——Service(一)

    这篇博文来介绍Android另一个十分重要的组件,Service.Service和Activity很类似,区别在于它运行在后台,不可见且没有界面.Service的优先级高于Activity,当系统负载 ...