OpenXml操作Excel
要使用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的更多相关文章
- 使用DocumentFormat.OpenXml操作Excel文件.xlsx
1.开始 DocumentFormat.OpenXml是ms官方给一个操作office三大件新版文件格式(.xlsx,.docx,.pptx)的组件:特色是它定义了OpenXml所包含的所有对象(たぶ ...
- C# - openxml 操作excel - '“System.IO.Packaging.Package”在未被引用的程序集中定义'
在 CodeProject中,有位网友写的一篇基于OpenXML SDK 2.0对excel(大数据量)进行操作,其中,运行的时候,有如下错误: 类型“System.IO.Packaging.Pack ...
- 使用OpenXml操作Excel,以下方法用于在添加列时修改Cell的CellReference属性。
以下方法实现了递增Excel中单元格的CellReference的功能,只支持两位字母. public static string CellReferenceIncrement(string cell ...
- Open XML操作Excel导入数据
项目中发现使用OleDb(using System.Data.OleDb)相关对象处理Excel导入功能,不是很稳定经常出问题,需要把这个问题解决掉.项目组提出使用OpenXML来处理Excel的导入 ...
- C# 操作 Excel 常见问题收集和整理(定期更新,欢迎交流)
经常会有项目需要把表格导出为 Excel 文件,或者是导入一份 Excel 来操作,那么如何在 C# 中操作 Excel 文件成了一个最基本的问题. 做开发这几年来,陆陆续续也接触过这样的需求,但因为 ...
- 使用OpenXML将Excel内容读取到DataTable中
前言:前面的几篇文章简单的介绍了如何使用OpenXML创建Excel文档.由于在平时的工作中需要经常使用到Excel的读写操作,简单的介绍下使用 OpenXML读取Excel中得数据.当然使用Open ...
- 转-C# 操作 Excel 常见问题收集和整理
经常会有项目需要把表格导出为 Excel 文件,或者是导入一份 Excel 来操作,那么如何在 C# 中操作 Excel 文件成了一个最基本的问题. 做开发这几年来,陆陆续续也接触过这样的需求,但因为 ...
- C# 操作 Excel 常见问题收集和整理
C# 操作 Excel 常见问题收集和整理(定期更新,欢迎交流) 经常会有项目需要把表格导出为 Excel 文件,或者是导入一份 Excel 来操作,那么如何在 C# 中操作 Excel 文件成了一个 ...
- C#使用oledb操作excel文件的方法
本文实例讲述了C#使用oledb操作excel文件的方法.分享给大家供大家参考.具体分析如下: 不管什么编程语言都会提供操作Excel文件的方式,C#操作Excel主要有以下几种方式: 1.Excel ...
随机推荐
- [android] 练习PopupWindow实现对话框
练习使用Dialog实习对话框 package com.example.tsh; import android.app.Activity; import android.app.Dialog; imp ...
- jsp servlet基础复习 Part2--GET,Post请求
最近进行servlet和jsp方面的梳理复习时,发现以前忽略了一个非常重要的知识点:get和post的请求(如果你觉得两者仅仅是提交数据量的大小以及方式不同就大错特错了)的正真区别,下面进行简答的整理 ...
- 设计模式-单例模式下对多例的思考(案例:Server服务器)
前述: 在学习单例模式后,对老师课上布置的课后作业,自然要使用单例模式,但是不是一般的单例,要求引起我的兴趣,案例是用服务器. 老师布置的要求是:服务器只有一个,但是使用这个服务器时候可以有多个对象( ...
- browserslist 目标浏览器配置表
为什么需要: 根据提供的目标浏览器的环境来,智能添加css前缀,js的polyfill垫片,来兼容旧版本浏览器,而不是一股脑的添加.避免不必要的兼容代码,以提高代码的编译质量. 共享使用browser ...
- select下拉框选择字体大小
效果: 结合Bootstrap.jQuery和ES6字符串模板与箭头函数使用JavaScript DOM操作动态添加option,随着option:selected选中的字号而改变相应的字体大小 代码 ...
- Maven pom.xml 常用打包配置
<build> <!-- 指定JAVA源文件目录 --> <sourceDirectory>src</sourceDirectory> <!-- ...
- Dockerfile定制镜像
一.Dockerfile是什么? 镜像定制实质就是定制每一层所添加的配置.文件. Dockerfile就是一个脚本来构建和定制镜像,把每一层的修改.安装.构建.操作都写入脚本.以此来解决体积.镜像构建 ...
- 原生js模拟jquery写法
function $_custom(fun) { document.onreadystatechange = function() { if (document.readyState == " ...
- CSS3弹性盒布局
使用自适应的窗口弹性盒布局 可以使div总宽度等于浏览器宽度,而且可以随着浏览器的改变而改变. <!DOCTYPE html> <html lang="zh-CN" ...
- 2013年未之wpf项目乱述
不知识为何现已很少在网上发帖,貌似人生的方向已经看的七七八八.要么用心工作,要么自主创业.无论怎么样,对于现在的我来说都是一种淡定的选择.作为一个c#程序员,今年下半年开始使用wpf,更觉得wpf将来 ...