Excel2003和2007的区别,除了不仅在外观上,还有相关的功能上也都得到很大改善,因为机制的问题(或许后缀问题把),在文件解析上,也与之前有很大区别

,对于我这代码君来说,还是直接上代码,比较直观

1:引用相关POI.jar包,

<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.9</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-scratchpad</artifactId><version>3.9</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.9</version></dependency><dependency><groupId>org.apache.xmlbeans</groupId><artifactId>xmlbeans</artifactId><version>2.3.0</version></dependency>


2:判断该文件是2003文件还是2007以上文件(原理通过文件后缀)

import java.math.BigDecimal;
import java.util.Date;import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.ss.usermodel.Cell;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import com.xyy.common.util.DateUtil;
import com.xyy.common.util.StringUtil;/*** Excel辅助工具类* @ClassName: ExcelCommonUtil * @author wangqinghua* @date 2017-3-21 上午11:07:46*/
public class ExcelCommonUtil {private static Logger LOGGER = LoggerFactory.getLogger(ExcelCommonUtil.class);/*** 判断是否为老版本的excel* @Title: isExcel2003* @param filePath   *.xls* @return* boolean* @author wangqinghua * @date 2017-3-21 上午11:05:19*/public static boolean isExcel2003(String filePath){return StringUtil.isNotEmpty(filePath) && filePath.matches("^.+\\.(?i)(xls)$");}/*** 判断是否为新版本的excel* @Title: isExcel2007* @param filePath   *.xlsx* @return* boolean* @author wangqinghua * @date 2017-3-21 上午11:05:43*/public static boolean isExcel2007(String filePath){return StringUtil.isNotEmpty(filePath) && filePath.matches("^.+\\.(?i)(xlsx)$");}/*** 根据单元格获取内容* @Title: getCellFormatValue* @param cell* @return* String* @author wangqinghua * @date 2017-3-10 下午10:19:04*/public static String getCellFormatValue(Cell cell) {String result="";switch (cell.getCellType()) {case HSSFCell.CELL_TYPE_STRING:result = cell.getRichStringCellValue().getString();break;case HSSFCell.CELL_TYPE_NUMERIC:if(HSSFDateUtil.isCellDateFormatted(cell)){  Date date = cell.getDateCellValue(); result =  DateUtil.date2String(date, "yyyy-MM-dd");}else{  result = String.valueOf(new BigDecimal(cell.getNumericCellValue()));  }break;case HSSFCell.CELL_TYPE_FORMULA:result = String.valueOf(cell.getNumericCellValue());break;default:result = "";break;}return result;}
}

3:文件判断完毕,根据POI对应的接口获取文件流,以及相关单元格值,组成对应的结果集package com.xyy.common.excel;

import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import javax.servlet.http.HttpServletRequest;import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
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.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import com.xyy.common.util.DateUtil;
import com.xyy.common.util.StringUtil;
/*** 导出数据表格的工具类* @ClassName: UtilOrganizeExcelData * @author wangqinghua* @date 2016-2-23 下午11:08:43*/
public class UtilOrganizeExcelData {private static Logger LOGGER = LoggerFactory.getLogger(ExcelCommonUtil.class);/*** @param titleCn 中文标题名* @param colsCn 中文列名* @param dataFileds 数据域名称* @param styles 数据的格式 0:顺序号 1:文本 2:应用参数  3:金额(实际金额带小数点) 4:金额* @param alignStyles 对齐方式 ALIGN_LEFT = 1;ALIGN_CENTER = 2;ALIGN_RIGHT = 3;* @param widths 列的宽度 默认为4000* @param dataList 数据List* @param appParams 应用参数对应的字段* @param fileName 下载文件名称* @return*/public static boolean listToExcel(HttpServletRequest request, String titleCn, String colsCn, String dataFileds, String styles, String alignStyles, String widths, List dataList,String appParams,String fileName){    String titleName;String closName;String excelSplitChar=",";//域分割符号String excelRowSplitChar=";";//行分割符号//目前先处理中文的标题和中文的列名titleName = titleCn;closName = colsCn;//---结束处理--------------       //---------------------------------------------------String columnFiledName[] = StringUtil.splitStringToString(dataFileds,excelSplitChar);//context中的变量名String columnStyles[] = StringUtil.splitStringToString(styles,excelSplitChar);//数据类型String columnAlignStyles[] = StringUtil.splitStringToString(alignStyles,excelSplitChar);//对齐方式String columnWidths[] = StringUtil.splitStringToString(widths,excelSplitChar);//宽度String columnAppParams[] = StringUtil.splitStringToString(appParams,excelSplitChar);//参数名int columnNum = columnFiledName.length;// 列数/*** closName的格式如下 "序号,项目,年初余额,收入,-,支出,-,期末余额;|,|,|,本月,本年累计,本月,本年累计,|"* 可以多行,行与行之间用“;”隔开* “|”表示改列别合并了,不处理*/String columnRowName[] = StringUtil.splitStringToString(closName,excelRowSplitChar); String columnName[][] = new String[columnRowName.length][columnNum];for(int i = 0; i < columnRowName.length; i++){columnName[i] = StringUtil.splitStringToString(columnRowName[i], excelSplitChar);}//创建一个工作表HSSFWorkbook wb = new HSSFWorkbook();//设置字体位置HSSFCellStyle style1_LEFT = wb.createCellStyle();//普通_左HSSFCellStyle style1_CENTER = wb.createCellStyle();//普通_中HSSFCellStyle style1_RIGHT = wb.createCellStyle();//普通_右HSSFCellStyle style2 = wb.createCellStyle();//表头HSSFCellStyle style3 = wb.createCellStyle();//标题HSSFCellStyle styleTemp = null;// 设置字体HSSFFont font1 = wb.createFont();HSSFFont font2 = wb.createFont();HSSFFont font3 = wb.createFont();font1.setFontHeightInPoints((short) 11);    //字体大小font1.setFontName("宋体");style1_LEFT.setFont(font1);style1_CENTER.setFont(font1);style1_RIGHT.setFont(font1);font2.setFontHeightInPoints((short) 11);font2.setFontName("宋体");font2.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);  //粗体style2.setFont(font2);font3.setFontHeightInPoints((short) 15);font3.setFontName("宋体");font3.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);style3.setFont(font3);//设置格式style1_LEFT.setAlignment(HSSFCellStyle.ALIGN_LEFT);// 水平左style1_LEFT.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 垂直举重style1_LEFT.setBorderBottom(HSSFCellStyle.BORDER_THIN);// 下边框style1_LEFT.setBorderLeft(HSSFCellStyle.BORDER_THIN);// 左边框style1_LEFT.setBorderRight(HSSFCellStyle.BORDER_THIN);// 右边框style1_LEFT.setBorderTop(HSSFCellStyle.BORDER_THIN);// 上边框style1_LEFT.setWrapText(true);// 自动换行style1_CENTER.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 水平居中style1_CENTER.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 垂直举重style1_CENTER.setBorderBottom(HSSFCellStyle.BORDER_THIN);// 下边框style1_CENTER.setBorderLeft(HSSFCellStyle.BORDER_THIN);// 左边框style1_CENTER.setBorderRight(HSSFCellStyle.BORDER_THIN);// 右边框style1_CENTER.setBorderTop(HSSFCellStyle.BORDER_THIN);// 上边框style1_CENTER.setWrapText(true);// 自动换行style1_RIGHT.setAlignment(HSSFCellStyle.ALIGN_RIGHT);// 水平居右style1_RIGHT.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 垂直举重style1_RIGHT.setBorderBottom(HSSFCellStyle.BORDER_THIN);// 下边框style1_RIGHT.setBorderLeft(HSSFCellStyle.BORDER_THIN);// 左边框style1_RIGHT.setBorderRight(HSSFCellStyle.BORDER_THIN);// 右边框style1_RIGHT.setBorderTop(HSSFCellStyle.BORDER_THIN);// 上边框style1_RIGHT.setWrapText(true);// 自动换行style2.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 水平居中style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 垂直举重style2.setBorderBottom(HSSFCellStyle.BORDER_THIN);// 下边框style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);// 左边框style2.setBorderRight(HSSFCellStyle.BORDER_THIN);// 右边框style2.setBorderTop(HSSFCellStyle.BORDER_THIN);// 上边框style2.setWrapText(true);// 自动换行style3.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 水平居中style3.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 垂直举重style3.setWrapText(true);// 自动换行/*******以下开始填充数据************/short rownum = 0;// 行序号HSSFSheet sheet = null;// 创建表单HSSFRow row = null;// 行HSSFCell cell = null;// 单元格//创建一个Sheetsheet = wb.createSheet("sheet");sheet.setDefaultColumnWidth(20);wb.setSheetName(0, "SHEET1");//为列设置宽度if(columnWidths != null && columnWidths.length == columnNum){for (int j = 0; j <columnNum; j++) {sheet.setColumnWidth(j, Integer.parseInt(columnWidths[j]==""?"4000":columnWidths[j]));}}else{for (int j = 0; j <columnNum; j++) {sheet.setColumnWidth(j, 4000);}}//写入数据row = sheet.createRow(rownum++);row.setHeight((short) 800);cell = row.createCell(0);// 大的标题cell.setCellType(HSSFCell.CELL_TYPE_STRING);cell.setCellValue(titleName);cell.setCellStyle(style3);//合并单元格sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, (columnNum-1)));// 标题栏   for(int i = 0; i < columnName.length; i++){row = sheet.createRow(rownum);row.setHeight((short) 500);for(int j = 0; j< columnNum; j++){if(columnName[i][j].equals("-")){sheet.addMergedRegion(new CellRangeAddress(rownum, j-1, rownum,j));}if(columnName[i][j].equals("|")){sheet.addMergedRegion(new CellRangeAddress(rownum-1, j, rownum, j));}cell = row.createCell(j); cell.setCellType(HSSFCell.CELL_TYPE_STRING);cell.setCellValue(columnName[i][j]);cell.setCellStyle(style2);}rownum++;}//数据部分//utb方法try{String contentTemp = null;String contentTemp2 = null;int size = dataList.size();for (int i = 0; i < size; i++) {row = sheet.createRow(rownum);//创建行Object kColl = dataList.get(i);                                                     for(int j = 0; j < columnNum; j++){//取出数据域的值,如果含有‘|’,则处理每一个数据域(一个列里含有多个数据域)String subColsFiledName[] = StringUtil.splitStringToString(columnFiledName[j], "|");String subColsStyles[] = StringUtil.splitStringToString(columnStyles[j], "|");String subColsAppParams[] = StringUtil.splitStringToString(columnAppParams[j], "|");contentTemp = "";contentTemp2 = "";String gap = "";if(subColsFiledName.length > 1)gap = " ";for(int k = 0;k < subColsFiledName.length;k++){//如果从当前的循环kColl取不到值,则从context从去取值 add 2007-11-22String valueStr = "";//如果是顺序号,则不需要获取数据域值if(!"0".equals(subColsStyles[k].trim())){try{if(subColsFiledName[k].indexOf("#")!= -1){String speName[] = StringUtil.splitStringToString(subColsFiledName[k],"#");if(speName.length>0){for(int m=0;m< speName.length;m++){try{valueStr = valueStr + ((Object)ReflectionUtils.getFieldValue(kColl, speName[m])).toString();}catch(Exception ex){ valueStr = valueStr + ((Object)ReflectionUtils.getFieldValue(kColl, speName[m])).toString();}}}}else{valueStr = ((Object)ReflectionUtils.getFieldValue(kColl, subColsFiledName[k])).toString();}}catch(Exception oe){valueStr = ((Object)ReflectionUtils.getFieldValue(kColl, subColsFiledName[k])).toString();} }//根据列的类型分别做处理// 0:顺序号 1:文本 2:应用参数  3:金额(实际金额) 4:金额(不处理)5:日期 6:时间//7:利率 8:错误信息//如果是5类型,则需要输入参数switch(Integer.parseInt(subColsStyles[k])){case 0: //顺序号contentTemp = contentTemp + String.valueOf(i+1) + gap;                 break;case 1: //文本contentTemp =  contentTemp + valueStr + gap;break;case 3://金额contentTemp2 = valueStr;contentTemp = contentTemp + contentTemp2 + gap;break;case 4://金额contentTemp2 = valueStr;contentTemp = contentTemp + contentTemp2 + gap;break;case 5: //日期contentTemp2 = valueStr;contentTemp =  contentTemp + contentTemp2 + gap;break;case 6: //时间contentTemp2 = valueStr;contentTemp =  contentTemp + contentTemp2 + gap;break;case 7: //利率contentTemp2 = valueStr;contentTemp =  contentTemp + String.valueOf(Double.parseDouble(contentTemp2)/(double)10000000) + gap;break;case 9://金额 处理   xxxx.xx这中输入,输出x,xxx.xxif(valueStr!=null&&valueStr.startsWith("."))valueStr="0"+valueStr;contentTemp2 = valueStr;contentTemp = contentTemp + contentTemp2 + gap;break;}}row.setHeight((short) 400);cell = row.createCell(j);cell.setCellType(HSSFCell.CELL_TYPE_STRING);//设置样式switch(Integer.parseInt(columnAlignStyles[j])){case 1: //左styleTemp = style1_LEFT;break;case 2: //中styleTemp = style1_CENTER;break;case 3: //右styleTemp = style1_RIGHT;break;}cell.setCellStyle(styleTemp);cell.setCellValue(contentTemp);}rownum++;}}catch(Exception ep){ep.printStackTrace();return false;}String fileNameStr = "";//处理文件名if(fileName.trim() == ""){fileName = "小药药数据下载";}fileNameStr = fileName +"_"+ DateUtil.date2String(new Date(), "yyyy-MM-dd")+".xls";request.setAttribute("excelFileName", fileNameStr);request.setAttribute("excelWorkBook", wb);return true;}public static Map<String, String> excelToList(InputStream inputStream,String fileName) {Map<String, String> content = new HashMap<String, String>();String str = "";Workbook wb = null;try {if(ExcelCommonUtil.isExcel2003(fileName)){wb = new HSSFWorkbook(inputStream);}else if(ExcelCommonUtil.isExcel2007(fileName)){wb = new XSSFWorkbook(inputStream);}} catch (IOException e) {LOGGER.error("excel转换异常",e);return content;}Sheet sheet = wb.getSheetAt(0);// 得到总行数int rowNum = sheet.getLastRowNum();Row row = sheet.getRow(0);int colNum = row.getPhysicalNumberOfCells();// 正文内容应该从第二行开始,第一行为表头的标题for (int i = 1; i <= rowNum; i++) {row = sheet.getRow(i);int j = 0;while (j < colNum) {str += ExcelCommonUtil.getCellFormatValue(row.getCell(j)).trim() + "|";j++;}content.put(i+"", str);str = "";}return content;}
}

上述就是整个完成的导入代码,在导出excel的上面,需要用到一些关于实体的反射原理,在这就不复制了,需要的朋友可以@我

关于Java使用POI对Excel2003和2007的导入和导出相关推荐

  1. java使用poi读取Excel2003版(.xls)

    java使用poi读取Excel2003版(.xls) File file = new file("D:\\test.xls"); FileInputStream fis = ne ...

  2. java进度条_Java web实时进度条整个系统共用(如java上传、下载进度条、导入、导出excel进度条等)...

    先上图: 文件上传的: 2017-05-04再次改进.在上传过程中用户可以按 Esc 来取消上传(取消当前上传,或者是全部上传)... 2019-03-26更新进度条显示体验 从服务器上压缩下载: 从 ...

  3. Java web实时进度条整个系统共用(如java上传、下载进度条、导入、导出excel进度条等)...

    先上图: 文件上传的: 2017-05-04再次改进.在上传过程中用户可以按 Esc 来取消上传(取消当前上传,或者是全部上传)... 从服务器上压缩下载: 从excel文件导入数据: 从数据库导出e ...

  4. java mongodb 备份_mongodb 备份、还原、导入、导出简单操作

    一. mongodump备份数据库 1.一般常用的备份命令格式 mongodump -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -o 文件存在路径 如果想导出所有数据库,可 ...

  5. java使用poi操作ppt(导入,导出,读取,添加,拼接,替换文本,页面排序)

    POI操作PPT文档(导入,导出,读取,添加,拼接,替换文本,页面排序) 注意:直接读取.pptx文件时不能使用${user}这样的作为替换标识,在读取.pptx文件时会解析成三段文本"${ ...

  6. java excel读取操作,Java 操作 Excel (读取Excel2003 2007,Poi兑现)

    Java 操作 Excel (读取Excel2003 2007,Poi实现) 一. Apache POI 简介( http://poi.apache.org/) 使用Java程序读写Microsoft ...

  7. java用poi操作excel,2003,2007,2010

    原文: [url]http://happyqing.iteye.com/blog/1965570[/url] [color=red]通过POI统一读取Excel文件[/color](兼容97-2003 ...

  8. java word 2003_[Java教程]POI 读取word (word 2003 和 word 2007)(转)

    [Java教程]POI 读取word (word 2003 和 word 2007)(转) 0 2017-09-27 16:00:29 POI 读取word (word 2003 和 word 200 ...

  9. Java面试poi中excel版本大小_java 中 poi解析Excel文件版本问题解决办法

    java 中 poi解析Excel文件版本问题解决办法 发布时间:2020-10-02 03:46:15 来源:脚本之家 阅读:91 作者:程诺 poi解析Excel文件版本问题解决办法 poi解析E ...

最新文章

  1. linux查看samba目录的配额,问Samba中一个共享目录,怎么限制其容量大小?不是用户级quota!!...
  2. recorder-list
  3. 《MySQL管理之道:性能调优、高可用与监控》china-pub首发!
  4. 欧姆龙变频器MX2参数_第442期丨【源程序】基于三菱西门子欧姆龙松下PLC实现喷水池控制系统;欧姆龙PLC编程软件更新步骤...
  5. scala (2) while 和变量
  6. JavaScript(九):JavaScript中的内置对象
  7. 帆软高级函数应用之数组函数
  8. 小学计算机课画图软件,小学小学三年级信息技术使用画图软件(一)
  9. 机器人仿真搭建(以ABB为例)
  10. 手机连接Fiddler后无法上网(已解决)
  11. python微信刷票代码_微信刷票漏洞详解,Python脚本实现一秒破万!
  12. 芝加哥犯罪率数据集(数据分析与特征处理)
  13. 牛客-练习赛101-推理小丑
  14. 微信朋友圈视频变长从6秒增加为10秒
  15. 3d Max安装失败(Microsoft Visual C++ 2010 Redistributable)
  16. 仿微信视频通话大小视图切换(SurfaceView实现)
  17. 用计算机弹起风了歌词,《起风了买辣椒也用券 抖音热歌起风了》的歌词 LRC完整歌词...
  18. 产品宣传数据投放广告指标
  19. 基于SSM+AmazeUI电力培训中心管理系统
  20. 基于51单片机的智能煤气天然气CO检测阈值报警器排气风扇方案原理图设计

热门文章

  1. rtl8188etv无线网卡驱动移植
  2. 韩国区块链步入快车道:SM、Kakao、三星、LG等巨头ALL IN
  3. 商业模式分析——3W2H分析法
  4. 2022人才市场洞察及薪酬指南
  5. 使用代码的当前SVN版本构建项目build版号
  6. 新年春节EDM邮件内容设计案例分享
  7. CUDA C/C++ 流和并发
  8. Ansible中的常用模块介绍
  9. centOS7.2.1511 bit64位 浏览器不能上网
  10. 面试官:说一说 Docker 原理