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 ...
随机推荐
- 隐藏uitabbar的代码
隐藏uitabbar的代码: /** * 隐藏UITabbar * * @param hidden yes隐藏 */ - (void)hidesTabBar:(BOOL)hidden{ [UIVi ...
- 架构实战项目心得(七):使用SpringBoot+Dubbo+Mybatisplus+Oracle搭建后台项目框架(二)
接下来我们将整合mybatisplus+Oracle,实现一个简单的查询.(期间踩了很多坑,遇到一些问题,还好慢慢解决了.现在是通过配置文件的方式来进行dubbo服务的注册和发布,希望以后能在学习和实 ...
- Java并发编程之volatile关键字解析
一内存模型的相关概念 二并发编程中的三个概念 三Java内存模型 四深入剖析volatile关键字 五使用volatile关键字的场景 volatile这个关键字可能很多朋友都听说过,或许也都用过.在 ...
- MVVMLight - IOC Containers and MVVM
在面向对象编程的早期,开发者要面对在应用程序或者类库中创建或检索类的实例的问题.针对这个问题有很多的解决方案.在过去几年中,依赖注入(DI)和控制反转(IoC)在开发者中很流行,并且取代了老的方案,比 ...
- java 并发(五)---AbstractQueuedSynchronizer(3)
文章代码分析和部分图片来自参考文章 问题 : CountDownLatch 和 CyclicBarrier 的区别 认识 CountDownLatch 分析这个类,首先了解一下它所可以 ...
- 本地如何将svn和git管理的代码做关联
svn和git都是广为流传的代码版本管理工具,实际项目中往往会将两者结合使用,那么如何将本地的一份代码和两者做有机的关联呢! 前提假设:项目已经在开发阶段中,此时变更了svn代码库的地址:或者是组里来 ...
- JavaScript--3种函数调用的方法
1.函数的简单调用: <script > function fn(p){ alert(p); } </script> <body><script> fn ...
- img底部空白以及多余的空白文本节点解决方案
1:img底部有空白的问题 img的css属性display的默认值是inline,这样会导致img的vertical-align的默认值是 baseline; baseline又不是bottom,只 ...
- Python入门-初始函数
今天让我们来初步认识一个在python中非常重要的组成部分:函数 首先,让我们来幻想这样一个场景: 比如说我们现在想要通过社交软件约一个妹子,步骤都有什么? print('打开手机 ') print( ...
- 花1台的钱入手2台【最能抗DDoS】阿里云主机【攻略】
花1台的钱入手2台[最能抗DDoS]阿里云主机[攻略]: 第一步:先申请0元半年 http://click.aliyun.com/m/335/:注:0元机器只有新帐号可申请第二步:再买6折37/月 h ...