当前位置: 首页 > 编程日记 > 正文

一个用微软官方的OpenXml读写Excel 目前网上不太普及的方法。

新版本的xlsx是使用新的存储格式,貌似是处理过的XML。

传统的excel处理方法,我真的感觉像屎。用Oldeb不方便,用com组件要实际调用excel打开关闭,很容易出现死。

对于OpenXML我网上搜了一下,很多人没有介绍。所以我就这里推荐下,相信会成为信息系统开发的必备。

先写出个例子,会发现如此的简介:

using System;
using System.Collections.Generic;
using System.Text;
using XFormular.config;
using System.IO;
using com.xtar.amfx;
using System.Runtime.Serialization.Formatters.Binary;
using System.Data;namespace XFormular.test
{class Class1{public void test(){DataTable table = new DataTable("1");table.Columns.Add("2");for (int i = 0; i < 10; i++){DataRow row = table.NewRow();row[0] = i;table.Rows.Add(row);}List<DataTable> lsit = new List<DataTable>();lsit.Add(table);OpenXmlSDKExporter.Export(AppDomain.CurrentDomain.BaseDirectory + "\\excel.xlsx", lsit);}}
}

写出代码:

using System;
using System.IO;
using System.Windows.Forms;
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
using DocumentFormat.OpenXml.Extensions;
using System.Collections.Generic;
using System.Data;
using System.Text.RegularExpressions;namespace XFormular
{//http://simpleooxml.codeplex.com///http://www.pin5i.com/showtopic-21817.html//http://blog.csdn.net/lbj147123/article/details/6603942class OpenXmlSDKExporter{private static string[] Level = {"A", "B", "C", "D", "E", "F", "G","H", "I", "G", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T","U", "V", "W", "X", "Y", "Z" };public static List<DataTable> Import(string path){List<DataTable> tables = new List<DataTable>();if (path.EndsWith(ExcelHelper.POSTFIX_SVN))return tables;using (MemoryStream stream = SpreadsheetReader.StreamFromFile(path)){using (SpreadsheetDocument doc = SpreadsheetDocument.Open(stream, true)){foreach (Sheet sheet in doc.WorkbookPart.Workbook.Descendants<Sheet>()){DataTable table = new DataTable(sheet.Name.Value);WorksheetPart worksheet = (WorksheetPart)doc.WorkbookPart.GetPartById(sheet.Id);List<string> columnsNames = new List<string>();foreach (Row row in worksheet.Worksheet.Descendants<Row>()){foreach (Cell cell in row){string columnName = Regex.Match(cell.CellReference.Value, "[a-zA-Z]+").Value;if (!columnsNames.Contains(columnName)){columnsNames.Add(columnName);}}}columnsNames.Sort(CompareColumn);foreach (string columnName in columnsNames){table.Columns.Add(columnName);}foreach (Row row in worksheet.Worksheet.Descendants<Row>()){DataRow tableRow = table.NewRow();table.Rows.Add(tableRow);foreach (Cell cell in row){string columnName = Regex.Match(cell.CellReference.Value, "[a-zA-Z]+").Value;tableRow[columnName] = GetValue(cell, doc.WorkbookPart.SharedStringTablePart);}}if (table.Rows.Count <= 0)continue;if (table.Columns.Count <= 0)continue;tables.Add(table);}}}return tables;}public static String GetValue(Cell cell, SharedStringTablePart stringTablePart){if (cell.ChildElements.Count == 0)return null;//get cell value
String value = cell.CellValue.InnerText;//Look up real value from shared string tableif ((cell.DataType != null) && (cell.DataType == CellValues.SharedString))value = stringTablePart.SharedStringTable.ChildElements[Int32.Parse(value)].InnerText;return value;}public static void Export(string path, List<DataTable> tables){using (MemoryStream stream = SpreadsheetReader.Create()){using (SpreadsheetDocument doc = SpreadsheetDocument.Open(stream, true)){SpreadsheetWriter.RemoveWorksheet(doc, "Sheet1");SpreadsheetWriter.RemoveWorksheet(doc, "Sheet2");SpreadsheetWriter.RemoveWorksheet(doc, "Sheet3");foreach (DataTable table in tables){WorksheetPart sheet = SpreadsheetWriter.InsertWorksheet(doc, table.TableName);WorksheetWriter writer = new WorksheetWriter(doc, sheet);SpreadsheetStyle style = SpreadsheetStyle.GetDefault(doc);foreach (DataRow row in table.Rows){for (int i = 0; i < table.Columns.Count; i++){string columnName = SpreadsheetReader.GetColumnName("A", i);string location = columnName + (table.Rows.IndexOf(row) + 1);writer.PasteText(location, row[i].ToString(), style);}}writer.Save();}SpreadsheetWriter.StreamToFile(path, stream);//保存到文件中
                }}}private static int CompareColumn(string x, string y){int xIndex = Letter_to_num(x);int yIndex = Letter_to_num(y);return xIndex.CompareTo(yIndex);}/// <summary>/// 数字26进制,转换成字母,用递归算法/// </summary>/// <param name="value"></param>/// <returns></returns>private static string Num_to_letter(int value){//此处判断输入的是否是正确的数字,略(正在表达式判断)int remainder = value % 26;//remainder = (remainder == 0) ? 26 : remainder;int front = (value - remainder) / 26;if (front < 26){return Level[front - 1] + Level[remainder];}else{return Num_to_letter(front) + Level[remainder];}//return "";
        }/// <summary>/// 26进制字母转换成数字/// </summary>/// <param name="letter"></param>/// <returns></returns>private static int Letter_to_num(string str){//此处判断是否是由A-Z字母组成的字符串,略(正在表达式片段)char[] letter = str.ToCharArray(); //拆分字符串int reNum = 0;int power = 1; //用于次方算值int times = 1;  //最高位需要加1int num = letter.Length;//得到字符串个数//得到最后一个字母的尾数值reNum += Char_num(letter[num - 1]);//得到除最后一个字母的所以值,多于两位才执行这个函数if (num >= 2){for (int i = num - 1; i > 0; i--){power = 1;//致1,用于下一次循环使用次方计算for (int j = 0; j < i; j++)           //幂,j次方,应该有函数
                    {power *= 26;}reNum += (power * (Char_num(letter[num - i - 1]) + times));  //最高位需要加1,中间位数不需要加一times = 0;}}//Console.WriteLine(letter.Length);return reNum;}/// <summary>/// 输入字符得到相应的数字,这是最笨的方法,还可用ASIICK编码;/// </summary>/// <param name="ch"></param>/// <returns></returns>private static int Char_num(char ch){switch (ch){case 'A':return 0;case 'B':return 1;case 'C':return 2;case 'D':return 3;case 'E':return 4;case 'F':return 5;case 'G':return 6;case 'H':return 7;case 'I':return 8;case 'J':return 9;case 'K':return 10;case 'L':return 11;case 'M':return 12;case 'N':return 13;case 'O':return 14;case 'P':return 15;case 'Q':return 16;case 'R':return 17;case 'S':return 18;case 'T':return 19;case 'U':return 20;case 'V':return 21;case 'W':return 22;case 'X':return 23;case 'Y':return 24;case 'Z':return 25;}return -1;}}
}
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.OleDb;namespace xtar_biz_codegen
{class ExcelHelper{public static string POSTFIX_97 = "XLS";public static string POSTFIX_03 = "XLSX";}
}

最后附送一个项目文件,可以自己测试:

http://pan.baidu.com/s/1msFuY

相关文章:

分析6千万条GitHub帖子,发现你的工作状态与表情符号强相关

作者 | 凌霄出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;新冠疫情使得远程办公的人数大幅度增加&#xff0c;然而&#xff0c;当越来越多的人远程工作时&#xff0c;人们的情绪和心理健康状态也难以通过日常面对面的交流来观察&#xff0c;雇主们也就无法获得员工…

软件定义网络 对我们有多重要?

软件定义网络(简称SDN)属于网络流量控制的下一个步骤。Tech Pro Research发布的调查报告正是以此为中心&#xff0c;旨在为我们展示企业如何使用SDN方案。 过去几年以来&#xff0c;以更为高效方式管理环境的需求正快速普及&#xff0c;这也使得网络领域的更高灵活性与控制手段…

SQL Server数据库六种数据移动方法

1. 通过工具DTS的设计器进行导入或导出DTS的设计器功能强大&#xff0c;支持多任务&#xff0c;也是可视化界面&#xff0c;容易操作&#xff0c;但知道的人一般不多&#xff0c;如果只是进行SQL Server数据库中部分表的移动&#xff0c;用这种方法最好&#xff0c;当然&#x…

[企业化NET]Window Server 2008 R2[3]-SVN 服务端 和 客户端 基本使用

1. 服务器基本安装即问题解决记录 √ 2. SVN环境搭建和客户端使用 2.1 服务端 和 客户端 安装 √ 2.2 项目建立与基本使用 √ 2.3 基本冲突解决,并版&#xff0c;tags 3. 数据库安装 4. 邮件服务器搭建 5. JIRA环境搭建和使用 6. CC.NET项目持续发布工具…

又一个Jupyter神器,操作Excel自动生成Python代码

来源 | Python数据科学&#xff08;ID: PyDataScience&#xff09;不得不说&#xff0c;Jupyter对于表的处理真的是越来越方便了&#xff0c;很多库可以直接实现可视化操作&#xff0c;无需写代码。但是这还不够&#xff0c;最近看到一个神器叫Mito&#xff0c;它真的是做到了无…

CIR:2020年全球数据中心应用AOC市场达$42亿

未来十年&#xff0c;QSFP和CXP将占有源光缆销售收入的大部分。到2020年&#xff0c;QSFP和QSFP28销售收入将分别达到7.27亿美元和7.41亿美元。 根据CIR(CommunicationsIndustryResearchers)的最新报告(《2015有源光缆市场&#xff1a;数据中心和高性能计算市场》)&#xff0c;…

Visual C#创建资源文件

资源文件顾名思义就是存放资源的文件。资源文件在程序设计中有着自身独特的优势&#xff0c;他独立于源程序&#xff0c;这样资源文件就可以被多个程序使用。同时在程序设计的时候&#xff0c;有时出于安全或者其他方面因素的考虑&#xff0c;把重要东西存放在资源文件中&#…

给IIS添加CA证书以支持https

一、在IIS中生成Certificate Signing Request (CSR) 个人理解&#xff1a;生成CSR就是生成“私钥/公钥对”之后从中提取出公钥。 1. 打开IIS Manager&#xff0c;在根节点中选择Server Certificates&#xff08;服务器证书&#xff09;&#xff0c;点击右侧的Create Certificat…

MathWorks的AI之路:面向工业场景,打通开发到部署的全链路

作者 | 阿司匹林 AI正在快速发展&#xff0c;并在更多的领域落地。对于MATLAB和Simulink的开发商MathWorks来说&#xff0c;把握AI的机会&#xff0c;显得尤为重要。 不少人对MATLAB等的印象依然停留在学校期间学习的高级线性代数解题器的阶段。然而&#xff0c;MATLAB在几年前…

《Android应用开发攻略》——1.3 从命令行创建 “Hello, World”应用程序

1.3 从命令行创建 “Hello, World”应用程序 Ian Darwin1.3.1 问题你想在不使用Eclipse ADT插件的情况下创建新的Android项目。1.3.2 解决方案使用Android开发工具包&#xff08;Android Development Kit&#xff0c;ADK&#xff09;中的android工具&#xff0c;利用creat proj…

将Excel文件数据库导入SQL Server

将Excel文件数据库导入SQL Server的三种方案//方案一&#xff1a; 通过OleDB方式获取Excel文件的数据&#xff0c;然后通过DataSet中转到SQL Server openFileDialog new OpenFileDialog();openFileDialog.Filter "Excel files(*.xls)|*.xls"; if(openFileDialog.…

Android----PopupWindow

Android的对话框有两种&#xff1a;PopupWindow和AlertDialog。它们的不同点在于&#xff1a;  AlertDialog的位置固定&#xff0c;而PopupWindow的位置可以随意  AlertDialog是非阻塞线程的&#xff0c;而PopupWindow是阻塞线程的 PopupWindow的位置按照有无偏移分&#x…

GitLab 在中国成立公司极狐,GitHub 还会远吗?

作者 | 宋慧 责编 | 苏宓出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;开源的种子已在中国落地开花。今天&#xff0c;中国的开源圈再次迎来一大盛事&#xff1a;全球第二大开源代码托管和项目管理平台 GitLab与红杉宽带等基金正式宣布成立中国合资公司极狐信…

消除危害 让BYOD策略更安全的几个秘诀

自带设备办公(BYOD)已经不是什么新鲜的事情&#xff0c;在近些年&#xff0c;随着移动设备的发展&#xff0c;员工利用自带设备办公已经成为一件非常平常的事情。 但是由于出于安全问题的考虑&#xff0c;一些企业禁止员工通过自带设备连接到公司网络中进行办公。他们不允许个人…

图神经网络如何对知识图谱建模? | 赠书

几乎所有早期的知识图谱嵌入的经典方法都是在对每个三元组打分&#xff0c;在实体和关系的表示中并没有完全考虑到整幅图的结构。早期&#xff0c;图神经网络的方法在知识图谱嵌入中并没有被重视&#xff0c;主要由于&#xff1a;早期的图神经网络更多是具有同种类型节点和边的…

浅析ado.net获取数据库元数据信息

写这个文章源于早先对ADO.Net获取数据库元数据上的认识&#xff0c;去年我在阅读ADO.Net Core Reference的时候曾经注意过DataSet的FillSchema的这个方法。这方面&#xff0c;在我之前的随笔中提到过Typed DataSet&#xff0c;而FillSchem与WriteXmlSchema的结合使用可以获得数…

账户密码策略修改

由于是虚拟测试环境所以AD 和 Exchange安装在同一台虚拟机上&#xff0c;所以修改账户密码策略已达到降低密码是设置的复杂度。 1.打开 --开始--管理工具--组策略管理 2.选择--Default Domain Policy 右键编辑 3.选择计算机设置--策略--安全设置--账户策略--密码策略 4.调整--密…

什么是新IP的四层网络技术

新IP技术共有四层&#xff1a;物理底层、网络服务、控制服务和编排。通过这四个层级实现网络虚拟化和软件定义网络&#xff0c;下面就来详细说一说什么是新IP的四层网络技术。 物理底层 新IP技术依然是一种基于硬件的技术&#xff0c;脱离不了物理底层&#xff0c;所有的虚拟软…

按拼音模糊匹配查询条件的生成类

转载了好几个地方&#xff0c;很难确定最早的出处。将源码贴出来先。1usingSystem; 2usingSystem.Text; 3usingSystem.IO; 45namespacets6{ 7 class test 8 { 9 private static string[] startChars {"啊", "芭", "擦","搭…

Java架构技术文档:并发编程+设计模式+常用框架+JVM+精选视频

本篇文章是我们整理的一份架构师的成长路线&#xff0c;包括了并发编程、设计模式、常用框架、中间件、微服务与分布式、常用工具、JVM、MySQL、数据结构与算法&#xff0c;还有架构师精选视频、架构师成长路线高清大图。又是新的一年&#xff0c;每一年都会有人在成为架构师的…

linux tune2fs简解(每日一令之五)

1:命令简介Linux下的文件检测命令&#xff0c;且可以自行定义自检周期2&#xff1a;用法[rootuyhd000225 ~]# tune2fs --help tune2fs 1.39 (29-May-2006) tune2fs&#xff1a;无效选项 -- - Usage: tune2fs [-c max_mounts_count] [-e errors_behavior] [-g group][-i interva…

物联网技术正颠覆传统医疗行业

如果你或你的爱人最近正在接受治疗&#xff0c;你可能会觉察到一些很酷的新设备可以辅助诊断和治疗。然而&#xff0c;你可能没有意识到&#xff0c;一部分这些设备已连接到互联网&#xff0c;成为物联网生态系统的一个重要组成部分。 到底如何连接核磁共振成像仪、CT扫描仪或实…

数组的进一步使用

数组是数据结构中最基本的结构形式&#xff0c;它是一种顺序式的结构&#xff0c;存储的是同一类型的数据。每个数组元素都拥有下标&#xff08;index&#xff09;和元素值&#xff08;value&#xff09;&#xff0c;下标方便存取数据&#xff0c;而元素值就是被存储的数据。 数…

百度香港二次上市,12 岁开发者、AI 机器人同台敲响“芯片代码锣”

整理 | AI科技大本营&#xff08;ID:rgznai100&#xff09;今日&#xff0c;继 2005 年百度在纳斯达克上市后&#xff0c;百度在香港的第二次上市。上市首日开盘价254港元每股&#xff0c;截至发稿&#xff0c;为 252 港元每股&#xff0c;总市值约为 7129 亿港元。现场“敲锣人…

Linux启动流程(二)

//...根据grub内核映像所在路径,读取内核映像&#xff0c;并进行解压缩操作。并调用start_kernel()函数来启动一系列的初始化函数并初始化各种设备&#xff0c;完成Linux核心环境的建立1.start_kernel(init/main.c)中调用一系列初始化函数:(1) 在屏幕上打印出当前的内核版本信息…

写代码可能是成为软件工程师最容易的部分

当然&#xff0c;写代码是超级重要的&#xff0c;但是我认为它只是整个过程中的一小部分&#xff0c;且不一定是最难学的。 学习如何写代码要花些时间&#xff0c;但是只要有足够的训练&#xff08;每天写代码&#xff0c;坚持数年&#xff09;&#xff0c;你就能真正擅长它。 …

不是“重复”造轮子,百度飞桨框架2.0如何俘获人心

2016 年&#xff0c;百度 PaddlePaddle 打响了国产深度学习框架开源的第一枪。 2019 年 4 月&#xff0c;在 Wave Summit 深度学习开发者峰会上&#xff0c;首次发布了PaddlePaddle 的中文名“飞桨”&#xff0c;开始强调自己更适合中国开发者&#xff0c;以及更加专注于深度学…

基于Sql Server 2008的分布式数据库的实践(一)

原文 基于Sql Server 2008的分布式数据库的实践&#xff08;一&#xff09; 配置Sql Server 2008&#xff08;Win7&#xff09; 1.打开SQL server2012&#xff0c;使用windows身份登录 2.登录后&#xff0c;右键选择“属性”。左侧选择“安全性”&#xff0c;选中右侧的“SQL S…

HttpHand和HttpModule的详细解释,包括Asp.Net对Http请求的处理流程。

了解当用户对一个.aspx页面提出请求时&#xff0c;后台的Web服务器的动作流程。当对这个流程了解后&#xff0c;我们就会明白HttpHandler和HttpModule的作用了。 首先&#xff0c;来了解一下IIS系统。它是一个程序&#xff0c;负责对网站的内容进行管理&#xff0c;以及对客户的…

WebGL初探

目前&#xff0c;我们有很多方案可以快速的接触到 WebGL 并绘制复杂的图形&#xff0c;但最后发现我们忽视了很多细节性的东西。当然&#xff0c;这对初学 WebGL 是有必要的&#xff0c;它能迅速提起我们对 WebGL 的学习兴趣。当学习到更加深入的阶段时&#xff0c;我们更想了解…