-
2022-03-04 10:28:54
前言:一开始用XSSFWorkbook实现读写xlsx后缀的excel文件,文件导出是完全没有问题的,后来需求变了,需要根据前台选择导出格式(xls或xlsx)来动态导出对应后缀的excel文件。
过程:1、一开始通过格式入参试图根据改变文件名的后缀来达到这个目的,结果导出xls文件的时候,还是报了文件格式不符合的打开错误
2、根据导出格式的入参,分别用XSSFWorkbook、HSSFWorkbook来写两次不同的导出逻辑,这种方法是可以的但是过于复杂。
结果:后面统一用了Workbook实现导出方法。既支持xls也支持xlsx
格式的excel;需要注意的是Workbook(子类:HSSFWorkbook – xls格式、XSSFWorkbook – xlsX格式)以及其方法RichTextString(HSSFRichTextString – xls格式、 XSSFRichTextString – xlsX格式)都是抽象接口,不能直接new,必须根据导出格式选择对应的子类创建对象
代码部分示例://exportMode:导出格式入参 //Workbook 的创建 Workbook wb = this.getWorkbook(exportMode); //单元格的创建 Cell cell = row.createCell(1); cell.setCellValue(this.getRichTextString(exportMode, sheetName)); cell.setCellStyle(headStyle); /** * 根据选择的导出格式生成对应的富文本 */ public RichTextString getRichTextString(String exportMode,String memo){ //0:xls格式 1:xlsx格式 if (Const.CNST_STR_FALSE.equals(exportMode)) { return new HSSFRichTextString(memo); } else { return new XSSFRichTextString(memo); } } /** * 根据选择的导出格式生成对应的Workbook */ public Workbook getWorkbook(String exportMode){ //0:xls格式 1:xlsx格式 if ("0".equals(exportMode)) { return new HSSFWorkbook(); } else { return new XSSFWorkbook(); } }
备注:xls和xlsx对象的区别
xls格式: HSSFWorkbook HSSFDataFormat HSSFSheet HSSFRow HSSFCell HSSFCellStyle HSSFFont HSSFRichTextString xlsX格式:XSSFWorkbook XSSFDataFormat XSSFSheet XSSFRow XSSFCell XSSFCellStyle XSSFFont XSSFRichTextString 通用格式: Workbook DataFormat Sheet Row Cell CellStyle Font RichTextString Workbook RichTextString 抽象接口,不能直接new,必须根据格式选择对应的子类创建对象
更多相关内容 -
开源个人珍藏 mfc(c++)读写xls和xlsx文件的类
2021-11-01 16:33:11开源个人珍藏 mfc(c++)读写xls和xlsx文件的类 -
ExcelReader:读取XLS和XLSX文件
2021-04-30 17:15:30ExcelReader 读取.xls和.xlsx Excel文件。 可用于解析电子表格并获取单元格值。 -
java读取excel ,xls和xlsx
2013-11-13 20:46:29java读取excel文件,兼容xlsx格式,可以用于07版本和10版本 -
java解析xls和xlsx
2022-02-17 15:51:12public class ParseExcel { /** * 解析文件的方法 *@param inputStream文件输入流 ,要解析的Excel文件输入流 *@param suffix 后缀名,xls或xlsx,代码决定使用什么方式解析Excel *@param startRow 从第几行开始...工具类:
package com.zhxd.guaranteeStation.util; import java.io.IOException; import java.io.InputStream; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import org.apache.poi.hssf.usermodel.HSSFDataFormat; import org.apache.poi.hssf.usermodel.HSSFDateUtil; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class ParseExcel { /** * 解析文件的方法 *@param inputStream文件输入流 ,要解析的Excel文件输入流 *@param suffix 后缀名,xls或xlsx,代码决定使用什么方式解析Excel *@param startRow 从第几行开始读取数据 *@return List<String[]> 集合中的一个元素对应一行解析的数据 * 元素为字符串数组类型,数组中的每一个元素对应一列数据 * @throws IOException */ public List<String[]> parseExcel(InputStream inputStream,String suffix,int startRow) throws IOException{ //定义Excel对象变量 Workbook workbook=null; //判断后缀 决定使用的解析方式,决定如何创建具体的对象 if("xls".equals(suffix)) { //2003版的解析方式 workbook=new HSSFWorkbook(inputStream); }else if("xlsx".equals(suffix)) { //2007 workbook=new XSSFWorkbook(inputStream); }else { //未知内容 return null; } //获取工作表,Excel分为若干个表,sheet //得到第一个表格sheet Sheet sheet = workbook.getSheetAt(0); if(sheet==null) { return null; } //获取表格中最后一行的行号 int lastRowNum = sheet.getLastRowNum(); //最后一行的行号大于startRow if(lastRowNum<startRow) { return null; } List<String[]> result=new ArrayList<String[]>(); //定义行变量和单元格变量 Row row=null; Cell cell=null; //循环读取 for (int rowNum = startRow; rowNum <= lastRowNum; rowNum++) { row=sheet.getRow(rowNum); //获取当前行的第一列和最后一列的标记 short firstCellNum = row.getFirstCellNum(); short lastCellNum = row.getLastCellNum(); if(lastCellNum!=0) { String[] rowArray=new String[lastCellNum]; for(int cellNum=firstCellNum;cellNum<lastCellNum;cellNum++) { //拿到单元格的值 cell=row.getCell(cellNum); //判断单元格是否有数据 if(cell==null) { rowArray[cellNum]=null; }else { rowArray[cellNum]=parseCell(cell); } } result.add(rowArray); } } return result; } /** * 解析单元格数据(返回字符串) */ private String parseCell(Cell cell) { String cellStr=null; //判断单元格的类型 switch (cell.getCellType()) { case STRING : //字符串类型单元格 cellStr=cell.getRichStringCellValue().toString(); break; case BLANK : //空数据 cellStr=""; break; case NUMERIC : //数字类型 包含日期、时间、数字 //判断日期【年月日2016-12-20 | 时分10:20】类型 if(HSSFDateUtil.isCellDateFormatted(cell)) { //判断具体类型,是日期还是时间 SimpleDateFormat sdf=null; if(cell.getCellStyle().getDataFormat()==HSSFDataFormat.getBuiltinFormat("h:mm")) { //时间 sdf=new SimpleDateFormat("HH:mm"); }else { //日期 sdf=new SimpleDateFormat("yyyy-MM-dd"); } Date temp = cell.getDateCellValue(); cellStr=sdf.format(temp); }else { //数字 double temp=cell.getNumericCellValue(); //数字格式化工具 DecimalFormat format=new DecimalFormat(); //查看单元格中的具体样式类型 String formatStr=cell.getCellStyle().getDataFormatString(); if(formatStr.equals("General")) { /**这个判断是四舍五入的,根据自己业务决定是否去掉 * 定义格式化正则 * 保留一位小数 #.# * 保留两位小数#.## */ format.applyPattern("#"); } //保留小数点后三位 cellStr=format.format(temp); } break; default: cellStr=""; } return cellStr; } }
controller:
public Response uploadLineExcel(@RequestParam(value = "file") MultipartFile file, String taskId) throws Exception { List<BaozhangTaskGeneratrixLine> baozhangTaskGeneratrixLineList = new ArrayList<>(); ParseExcel parser=new ParseExcel(); InputStream inputStream = file.getInputStream(); String suffix="xlsx"; int startRow=1; List<String[]> result = parser.parseExcel(inputStream, suffix, startRow);
循环数组自己写
-
读取xls和xlsxjar包
2020-10-04 21:34:59从java读取xls和xlsx所必须使用的jar包 -
mfc(c++)读写xls和xlsx文件的类
2016-05-26 11:02:08此程序用于MFC读写excle文件的操作类。可以操作xls和xlsx文件。 有网上的收集的资料,和优化后可用在项目中的操作类。有兴趣的朋友可以在此基础上添加更多的读写功能。 -
一个简单的基于Android读取xls和xlsx文件的例子
2019-08-23 11:40:48一个简单的基于Android读取xls和xlsx文件的例子,采用的POI。 -
Python学习_几种存取xls/xlsx文件的方法总结
2020-12-23 17:45:34想在深度学习程序运行时动态存下来一些参数。 存成Excel文件查看方便,就查了几种方法,做个测试。因为我平常也不怎么用 Excel,简单的存取数据就够了。...#存第一行cell(1,1)和cell(1,2) booksheet.write(0,0,34) book -
C# Excel导入导出,基于NOPI(兼容xls和xlsx)
2019-12-30 14:59:171.兼容xls,xlsx;基于NOPI操作,支持xls和xlsx; 2.包含Datable转list; 3.list转Datable; -
java Excel导入(兼容格式xls和xlsx)
2022-02-15 09:24:27HSSFWorkbook:是操作Excel2003以前(包括2003)的版本,扩展名是.xls; 此种方式的局限就是导出的行数至多为65535行,超出65536条后系统就会报错。 第二种:XSSFWorkbook XSSFWorkbook:是操作Excel2007后的版本,...第一种:HSSFWorkbook HSSFWorkbook:是操作Excel2003以前(包括2003)的版本,扩展名是.xls; 此种方式的局限就是导出的行数至多为65535行,超出65536条后系统就会报错。 第二种:XSSFWorkbook XSSFWorkbook:是操作Excel2007后的版本,扩展名是.xlsx; 为了突破HSSFWorkbook的65535行局限。其对应的是excel2007(1048576行,16384列)扩展名为“.xlsx”, 最多可以导出104万行。
//importFile 为excel文件路径 Workbook book = null; try { book = new XSSFWorkbook(importFile); } catch (Exception ex) { book = new HSSFWorkbook(new FileInputStream(importFile)); } //初始化,拼接脚本表头 StringBuilder jkFields = new StringBuilder(); //根据excel,拼接数据 StringBuilder sbData = new StringBuilder(); sbData.append(jkFields); int j = 0; //0:获取第一个Sheet的内容 Sheet sheet = book.getSheetAt(0); //获取excel最大行数 int lastRowNum = sheet.getLastRowNum(); //获取excel最大列数 int lastColNum = sheet.getRow(0).getLastCellNum(); //循环行 for (int rowNum = 1; rowNum < lastRowNum; rowNum ++) { row = sheet.getRow(rowNum); cell = row.getCell(0); //姓名或身份证号为空,跳出进行下一次循环 if(cell.getCellTypeEnum() == CellType.BLANK){ continue; } j++; //循环列 for (int colNum = 0; colNum < lastColNum; colNum ++) { if(sheet.isColumnHidden(colNum)){ //隐藏列 continue; } cell = row.getCell(colNum); if (cell == null) { //数据为空的列 continue; } else { //数字类型 if(cell.getCellTypeEnum() == CellType.NUMERIC) { BigDecimal val = new BigDecimal(cell.getNumericCellValue()); sbData.append(",'").append(val).append("'"); } //字符类型 else if(cell.getCellTypeEnum() == CellType.STRING) { sbData.append(",'").append(cell.getStringCellValue()).append("'"); } //内容为空 else if(cell.getCellTypeEnum() == CellType.BLANK) { sbData.append(",'").append(cell.getStringCellValue()).append("'"); } } } //每1000条执行一次 if (0 == j % 1000) { //执行脚本,初始化脚本 sbData = new StringBuilder(); } }
-
读取xls和xlsx的不同方法
2021-01-21 11:46:12最近遇到一个问题,xls文件只能用兼容模式打开,如果不想要用兼容模式,就要换成xlsx。 但是换成xlsx之后发现另外一个问题,原来读取xls用到的 xlrd.open_workbook() 读取xlsx会出现问题。读取写入之后显示: ...最近遇到一个问题,xls文件只能用兼容模式打开,如果不想要用兼容模式,就要换成xlsx。
但是换成xlsx之后发现另外一个问题,原来读取xls用到的
xlrd.open_workbook() 读取xlsx会出现问题。读取写入之后显示:
醉了。
然后找到了这个博客。
最后的解决方案: 使用openpyxl。
原代码1:
#GUI module def recording2(row, col, value): workbook = xlrd.open_workbook(r"G:\expert system data\Machine Database.xlsx") #ws = workbook.sheet_by_index(0) workbook1 = copy(workbook) ws1 = workbook1.get_sheet(0) ws1.write(row, col, value) workbook1.save(r"G:\expert system data\Machine Database.xlsx")
改成:
def recording2(row, col, value): workbook = openpyxl.load_workbook(r"G:\expert system data\Machine Database.xlsx") worksheet = workbook.worksheets[0] worksheet.cell(row=row, column=col).value = value workbook.save(r"G:\expert system data\Machine Database.xlsx")
原代码2:
#smart_RFS module workbook = xlrd.open_workbook(r"G:\expert system data\Machine Database.xlsx") workbook1 = copy(workbook) ws1 = workbook1.get_sheet(0) style = xlwt.XFStyle() style.num_format_str = 'yyyy-mm-dd hh:mm:ss' ws1.write(row, 8, current_time, style) workbook1.save(r"G:\expert system data\Machine Database.xlsx")
改成:
workbook = openpyxl.load_workbook(r"G:\expert system data\Machine Database.xlsx") worksheet = workbook.worksheets[0] worksheet.cell(row=row, column=8).value = current_time workbook.save(r"G:\expert system data\Machine Database.xlsx")
原代码3:
#functions modula def recording(tester, product, name, time, detail, sol): print("row") workbook = xlrd.open_workbook(r"G:\expert system data\Machine Database.xlsx") ws = workbook.sheet_by_index(0) rowNum = ws.nrows workbook1 = copy(workbook) style = xlwt.XFStyle() style.num_format_str = 'yyyy-mm-dd hh:mm:ss' ws1 = workbook1.get_sheet(0) ws1.write(rowNum, 0, tester) ws1.write(rowNum, 1, product) ws1.write(rowNum, 2, name) ws1.write(rowNum, 3, time, style) print("time", time) ws1.write(rowNum, 4, detail) ws1.write(rowNum, 5, sol) workbook1.save(r"G:\expert system data\Machine Database.xlsx") return rowNum
改成:
def recording(tester, product, name, time, detail, sol): print("row") workbook = openpyxl.load_workbook(r"G:\expert system data\Machine Database.xlsx") worksheet = workbook.worksheets[0] rowNum = worksheet.max_row worksheet.cell(row = rowNum, column=0).value = tester worksheet.cell(row = rowNum, column=1).value = product worksheet.cell(row = rowNum, column=2).value = name worksheet.cell(row = rowNum, column=3).value = time print("time", time) worksheet.cell(row = rowNum, column=4).value = detail worksheet.cell(row = rowNum, column=5).value = sol worksheet.cell(row=2, column=2).value = 2 workbook.save(r"G:\expert system data\Machine Database.xlsx") return rowNum
遇到了其他小问题:
和xlrd的write不同, openpyxl的行和列是从1 开始,所以相比于xlrd,要全部加上1。
-
Python利用xlrd将Excel表在xls和xlsx格式之间转换
2021-07-20 15:44:21只能讲文本转换,无法转换格式 帮助链接: ... #coding:utf-8 # 引入模块 import xlrd #判断Excel表是否存在 try: flile_name = "日盘单.xls" xls = xlrd.open_workbook(fl -
xls2pdf:这是用于将excel XLS和XLSX文件转换为HTML或PDF格式的库
2021-05-17 07:23:58这是用于将excel XLS和XLSX文件转换为HTML或PDF格式的库 基于: jxls-用于将XLS,XLSX转换为HTML itext-用于将HTML转换为PDF 用法: 用于HTML(Xls2HtmlConverter) new Xls2HtmlConverter ( new ... -
使用poi将xls转为xlsx,所有样式完美转换
2020-09-11 14:31:10使用poi将xls格式的Excel转为xlsx,文件中的所有样式都可以完美转换,例如合并栏、背景和单元格样式等。Java源码 -
java读取xls和xlsx文件
2019-09-23 14:14:44"读取Xlsx文件异常" ) ; e . printStackTrace ( ) ; } finally { is . close ( ) ; } return count ; } /** * * <p>Title: readExecl</p> * <p>Description:读取Execl</p> ... -
批量xls转xlsx软件
2019-01-21 15:31:18Convert XLSX to XLS:CXS45YKL467EVB Convert XLS to XLSX:CXX34JHY87ZX4T -
C# Excel格式转换,xls转换成xlsx,不依赖Excel,不依赖office
2021-02-03 15:44:30支持单元格格式,合并单元格转换,不依赖安装excel,使用开源NPOI 2.5.1版本,VS2019调试通过 -
xls和 xlsx的区别 xlsx Excel文件怎么转换成 xls文件
2019-04-21 14:26:36xls和 xlsx的区别 xlsx Excel文件怎么转换成 xls文件 -
xls和xlsx的区别
2019-04-04 16:53:20office 97-2003版本:xls doc office 2007版本:xlsx docx xls,是一个特有的二进制格式,其核心结构是复合文档,最多容纳65536行数据 xlsx,核心结构是xml类型,采用基于xml的压缩方式,使其占用空间更小,最后... -
使用POI导出Excel,以及xls和xlsx格式问题
2021-07-02 10:59:02i 此为输出xlsx格式。 如果需要xls格式。将所有XSSF改为HSSF,并修改response.setContentType为被注释掉的代码,以及前端按钮方法的type为type: "application/vnd.ms-excel" //前端 //导出按钮方法 onExport() { ... -
c#读取excel的xls和xlsx文件的方法
2020-03-11 15:50:20//此连接可以操作.xls与.xlsx文件 OleDbConnection conn = new OleDbConnection(strConn); conn.Open(); DataSet ds = new DataSet(); OleDbDataAdapter odda = new OleDbDataAdapter(string.Format(“SELECT * FROM... -
Sheet Viewer:XLS和XLSX电子表格查看器-开源
2021-05-10 07:45:18Sheet Viewer是一个非常简单的XLS和XLSX查看器。 -
POI解析xls和xlsx表格
2018-10-18 10:39:22日常工作中,解析xls数据到数据库,或者从数据库导出数据到xls,本问介绍如何直接使用pol来完成次需求, 需要导入apache pol工具包,下载地址 代码如下: package com.xlsx; import java.io.FileInputStream; ... -
poi转换xls到xlsx
2020-12-28 16:07:42poi转换xls到xlsx -
doc和docx、xls和xlsx、ppt和pptx有什么区别?
2019-12-07 01:19:24docx 是Office2007使用的,是用新的基于XML的压缩文件格式取代了其目前专有的默认文件格式,在传统的文件名扩展名后面添加了字母x(即.docx取代.doc、.xlsx取代.xls,等等) .docx文件比.doc文件所占用空间更小 微软... -
poi读取xlsx和xls
2019-04-04 01:01:46NULL 博文链接:https://fireflylover.iteye.com/blog/1484218 -
【JAVA_POI】解析Excel文档(xls和xlsx)
2020-08-17 13:53:07excel文档有.xls和.xlsx两种后缀,那么这两种后缀有什么区别呢? 1.1 文件核心结构不同 xls 是一个特有的二进制格式,其核心结构是复合文档类型的结构。 xlsx 的核心结构是 XML 类型的结构,并且基于XML进行... -
poi导入excel,支持xls和xlsx格式
2018-10-15 20:26:42//根据文件后缀名不同(xls和xlsx)获得不同的Workbook实现类对象 if(fileName.endsWith(xls)){ //2003 workbook = new HSSFWorkbook(is); }else if(fileName.endsWith(xlsx)){ //2007 workbook = new ... -
Excel的xls和xlsx文件转csv
2016-10-28 17:45:22Excel的xls和xlsx文件转csv,依赖最新的python3.5.2(www.python.org)以及python的一个库xlrd(https://pypi.python.org/pypi/xlrd) 记得安装python的时候把所有的安装全勾上,才能安装