代码语言
.
CSharp
.
JS
Java
Asp.Net
C
MSSQL
PHP
Css
PLSQL
Python
Shell
EBS
ASP
Perl
ObjC
VB.Net
VBS
MYSQL
GO
Delphi
AS
DB2
Domino
Rails
ActionScript
Scala
代码分类
文件
系统
字符串
数据库
网络相关
图形/GUI
多媒体
算法
游戏
Jquery
Extjs
Android
HTML5
菜单
网页交互
WinForm
控件
企业应用
安全与加密
脚本/批处理
开放平台
其它
【
Java
】
用POI与EXCEL模板读写文件
作者:
laigous
/ 发布于
2015/1/12
/
822
package com.common.utils; import java.io.FileInputStream; import java.io.IOException; import java.util.Date; import java.util.HashMap; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFRichTextString; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; @SuppressWarnings({"rawtypes","unchecked"}) public class ExcelUtil { /************************************XSSF*********************************************/ /** * 取得指定单元格行和列 * @param keyMap 所有单元格行、列集合 * @param key 单元格标识 * @return 0:列 1:行(列表型数据不记行,即1无值) */ public static int[] getPos(HashMap keyMap, String key){ int[] ret = new int[0]; String val = (String)keyMap.get(key); if(val == null || val.length() == 0) return ret; String pos[] = val.split(","); if(pos.length == 1 || pos.length == 2){ ret = new int[pos.length]; for(int i0 = 0; i0 < pos.length; i0++){ if(pos[i0] != null && pos[i0].trim().length() > 0){ ret[i0] = Integer.parseInt(pos[i0].trim()); } else { ret[i0] = 0; } } } return ret; } /** * 取对应格子的值 * @param sheet * @param rowNo 行 * @param cellNo 列 * @return * @throws IOException */ public static String getCellValue(XSSFSheet sheet,int rowNo,int cellNo) { String cellValue = null; XSSFRow row = sheet.getRow(rowNo); XSSFCell cell = row.getCell(cellNo); if (cell != null) { if (cell.getCellType() == XSSFCell.CELL_TYPE_NUMERIC) { cellValue = getCutDotStr(Double.toString(cell.getNumericCellValue())); } else if (cell.getCellType() == XSSFCell.CELL_TYPE_STRING) { cellValue = cell.getStringCellValue(); } if (cellValue != null) { cellValue = cellValue.trim(); } } else { cellValue = null; } return cellValue; } /** * 取整数 * @param srcString * @return */ private static String getCutDotStr(String srcString) { String newString = ""; if (srcString != null && srcString.endsWith(".0")) { newString = srcString.substring(0,srcString.length()-2); } else { newString = srcString; } return newString; } /** * 读数据模板 * @param 模板地址 * @throws IOException */ public static HashMap[] getTemplateFile(String templateFileName) throws IOException { FileInputStream fis = new FileInputStream(templateFileName); XSSFWorkbook wbPartModule = new XSSFWorkbook(fis); int numOfSheet = wbPartModule.getNumberOfSheets(); HashMap[] templateMap = new HashMap[numOfSheet]; for(int i = 0; i < numOfSheet; i++){ XSSFSheet sheet = wbPartModule.getSheetAt(i); templateMap[i] = new HashMap(); readSheet(templateMap[i], sheet); } fis.close(); return templateMap; } /** * 读模板数据的样式值置等信息 * @param keyMap * @param sheet */ private static void readSheet(HashMap keyMap, XSSFSheet sheet){ int firstRowNum = sheet.getFirstRowNum(); int lastRowNum = sheet.getLastRowNum(); for (int j = firstRowNum; j <= lastRowNum; j++) { XSSFRow rowIn = sheet.getRow(j); if(rowIn == null) { continue; } int firstCellNum = rowIn.getFirstCellNum(); int lastCellNum = rowIn.getLastCellNum(); for (int k = firstCellNum; k <= lastCellNum; k++) { // XSSFCell cellIn = rowIn.getCell((short) k); XSSFCell cellIn = rowIn.getCell(k); if(cellIn == null) { continue; } int cellType = cellIn.getCellType(); if(XSSFCell.CELL_TYPE_STRING != cellType) { continue; } String cellValue = cellIn.getStringCellValue(); if(cellValue == null) { continue; } cellValue = cellValue.trim(); if(cellValue.length() > 2 && cellValue.substring(0,2).equals("<%")) { String key = cellValue.substring(2, cellValue.length()); String keyPos = Integer.toString(k)+","+Integer.toString(j); keyMap.put(key, keyPos); keyMap.put(key+"CellStyle", cellIn.getCellStyle()); } else if(cellValue.length() > 3 && cellValue.substring(0,3).equals("<!%")) { String key = cellValue.substring(3, cellValue.length()); keyMap.put("STARTCELL", Integer.toString(j)); keyMap.put(key, Integer.toString(k)); keyMap.put(key+"CellStyle", cellIn.getCellStyle()); } } } } /** * 获取格式,不适于循环方法中使用,wb.createCellStyle()次数超过4000将抛异常 * @param keyMap * @param key * @return */ public static CellStyle getStyle(HashMap keyMap, String key,XSSFWorkbook wb) { CellStyle cellStyle = null; cellStyle = (CellStyle) keyMap.get(key+"CellStyle"); //当字符超出时换行 cellStyle.setWrapText(true); CellStyle newStyle = wb.createCellStyle(); newStyle.cloneStyleFrom(cellStyle); return newStyle; } /** * Excel单元格输出 * @param sheet * @param row 行 * @param cell 列 * @param value 值 * @param cellStyle 样式 */ public static void setValue(XSSFSheet sheet, int row, int cell, Object value, CellStyle cellStyle){ XSSFRow rowIn = sheet.getRow(row); if(rowIn == null) { rowIn = sheet.createRow(row); } XSSFCell cellIn = rowIn.getCell(cell); if(cellIn == null) { cellIn = rowIn.createCell(cell); } if(cellStyle != null) { //修复产生多超过4000 cellStyle 异常 //CellStyle newStyle = wb.createCellStyle(); //newStyle.cloneStyleFrom(cellStyle); cellIn.setCellStyle(cellStyle); } //对时间格式进行单独处理 if(value==null){ cellIn.setCellValue(""); }else{ if (isCellDateFormatted(cellStyle)) { cellIn.setCellValue((Date) value); } else { cellIn.setCellValue(new XSSFRichTextString(value.toString())); } } } /** * 根据表格样式判断是否为日期格式 * @param cellStyle * @return */ public static boolean isCellDateFormatted(CellStyle cellStyle){ if(cellStyle==null){ return false; } int i = cellStyle.getDataFormat(); String f = cellStyle.getDataFormatString(); return org.apache.poi.ss.usermodel.DateUtil.isADateFormat(i, f); } /** * 适用于导出的数据Excel格式样式重复性较少 * 不适用于循环方法中使用 * @param wbModule * @param sheet * @param pos 模板文件信息 * @param startCell 开始的行 * @param value 要填充的数据 * @param cellStyle 表格样式 */ public static void createCell(XSSFWorkbook wbModule, XSSFSheet sheet,HashMap pos, int startCell,Object value,String cellStyle){ int[] excelPos = getPos(pos, cellStyle); setValue(sheet, startCell, excelPos[0], value, getStyle(pos, cellStyle,wbModule)); } /************************************XSSF*******************************************/ } 2. [文件] ExcelHandle.java ~ 12KB 下载(1) ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 package com.common.utils; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; /** * 对excel进行操作工具类 *@author xiliang.xiao *@date 2015年1月8日 下午1:46:36 * **/ @SuppressWarnings("rawtypes") public class ExcelHandle { private Map<String,HashMap[]> tempFileMap = new HashMap<String,HashMap[]>(); private Map<String,Map<String,Cell>> cellMap = new HashMap<String,Map<String,Cell>>(); private Map<String,FileInputStream> tempStream = new HashMap<String, FileInputStream>(); private Map<String,XSSFWorkbook> tempWorkbook = new HashMap<String, XSSFWorkbook>(); private Map<String,XSSFWorkbook> dataWorkbook = new HashMap<String, XSSFWorkbook>(); /** * 单无格类 * @author xiliang.xiao * */ class Cell{ private int column;//列 private int line;//行 private CellStyle cellStyle; public int getColumn() { return column; } public void setColumn(int column) { this.column = column; } public int getLine() { return line; } public void setLine(int line) { this.line = line; } public CellStyle getCellStyle() { return cellStyle; } public void setCellStyle(CellStyle cellStyle) { this.cellStyle = cellStyle; } } /** * 向Excel中输入相同title的多条数据 * @param tempFilePath excel模板文件路径 * @param cellList 需要填充的数据(模板<!%后的字符串) * @param dataList 填充的数据 * @param sheet 填充的excel sheet,从0开始 * @throws IOException */ public void writeListData(String tempFilePath,List<String> cellList,List<Map<String,Object>> dataList,int sheet) throws IOException{ //获取模板填充格式位置等数据 HashMap temp = getTemp(tempFilePath,sheet); //按模板为写入板 XSSFWorkbook temWorkbook = getTempWorkbook(tempFilePath); //获取数据填充开始行 int startCell = Integer.parseInt((String)temp.get("STARTCELL")); //数据填充的sheet XSSFSheet wsheet = temWorkbook.getSheetAt(sheet); //移除模板开始行数据即<!% wsheet.removeRow(wsheet.getRow(startCell)); if(dataList!=null&&dataList.size()>0){ for(Map<String,Object> map:dataList){ for(String cell:cellList){ //获取对应单元格数据 Cell c = getCell(cell,temp,temWorkbook,tempFilePath); //写入数据 ExcelUtil.setValue(wsheet, startCell, c.getColumn(), map.get(cell), c.getCellStyle()); } startCell++; } } } /** * 按模板向Excel中相应地方填充数据 * @param tempFilePath excel模板文件路径 * @param cellList 需要填充的数据(模板<%后的字符串) * @param dataMap 填充的数据 * @param sheet 填充的excel sheet,从0开始 * @throws IOException */ public void writeData(String tempFilePath,List<String> cellList,Map<String,Object> dataMap,int sheet) throws IOException{ //获取模板填充格式位置等数据 HashMap tem = getTemp(tempFilePath,sheet); //按模板为写入板 XSSFWorkbook wbModule = getTempWorkbook(tempFilePath); //数据填充的sheet XSSFSheet wsheet = wbModule.getSheetAt(sheet); if(dataMap!=null&&dataMap.size()>0){ for(String cell:cellList){ //获取对应单元格数据 Cell c = getCell(cell,tem,wbModule,tempFilePath); ExcelUtil.setValue(wsheet, c.getLine(), c.getColumn(), dataMap.get(cell), c.getCellStyle()); } } } /** * Excel文件读值 * @param tempFilePath * @param cell * @param sheet * @return * @throws IOException */ public Object getValue(String tempFilePath,String cell,int sheet,File excelFile) throws IOException{ //获取模板填充格式位置等数据 HashMap tem = getTemp(tempFilePath,sheet); //模板工作区 XSSFWorkbook temWorkbook = getTempWorkbook(tempFilePath); //数据工作区 XSSFWorkbook dataWorkbook = getDataWorkbook(tempFilePath, excelFile); //获取对应单元格数据 Cell c = getCell(cell,tem,temWorkbook,tempFilePath); //数据sheet XSSFSheet dataSheet = dataWorkbook.getSheetAt(sheet); return ExcelUtil.getCellValue(dataSheet, c.getLine(), c.getColumn()); } /** * 读值列表值 * @param tempFilePath * @param cell * @param sheet * @return * @throws IOException */ public List<Map<String,Object>> getListValue(String tempFilePath,List<String> cellList,int sheet,File excelFile) throws IOException{ List<Map<String,Object>> dataList = new ArrayList<Map<String,Object>>(); //获取模板填充格式位置等数据 HashMap tem = getTemp(tempFilePath,sheet); //获取数据填充开始行 int startCell = Integer.parseInt((String)tem.get("STARTCELL")); //将Excel文件转换为工作区间 XSSFWorkbook dataWorkbook = getDataWorkbook(tempFilePath,excelFile) ; //数据sheet XSSFSheet dataSheet = dataWorkbook.getSheetAt(sheet); //文件最后一行 int lastLine = dataSheet.getLastRowNum(); for(int i=startCell;i<=lastLine;i++){ dataList.add(getListLineValue(i, tempFilePath, cellList, sheet, excelFile)); } return dataList; } /** * 读值一行列表值 * @param tempFilePath * @param cell * @param sheet * @return * @throws IOException */ public Map<String,Object> getListLineValue(int line,String tempFilePath,List<String> cellList,int sheet,File excelFile) throws IOException{ Map<String,Object> lineMap = new HashMap<String, Object>(); //获取模板填充格式位置等数据 HashMap tem = getTemp(tempFilePath,sheet); //按模板为写入板 XSSFWorkbook temWorkbook = getTempWorkbook(tempFilePath); //将Excel文件转换为工作区间 XSSFWorkbook dataWorkbook = getDataWorkbook(tempFilePath,excelFile) ; //数据sheet XSSFSheet dataSheet = dataWorkbook.getSheetAt(sheet); for(String cell:cellList){ //获取对应单元格数据 Cell c = getCell(cell,tem,temWorkbook,tempFilePath); lineMap.put(cell, ExcelUtil.getCellValue(dataSheet, line, c.getColumn())); } return lineMap; } /** * 获得模板输入流 * @param tempFilePath * @return * @throws FileNotFoundException */ private FileInputStream getFileInputStream(String tempFilePath) throws FileNotFoundException { if(!tempStream.containsKey(tempFilePath)){ tempStream.put(tempFilePath, new FileInputStream(tempFilePath)); } return tempStream.get(tempFilePath); } /** * 获得输入工作区 * @param tempFilePath * @return * @throws IOException * @throws FileNotFoundException */ private XSSFWorkbook getTempWorkbook(String tempFilePath) throws FileNotFoundException, IOException { if(!tempWorkbook.containsKey(tempFilePath)){ tempWorkbook.put(tempFilePath, new XSSFWorkbook(getFileInputStream(tempFilePath))); } return tempWorkbook.get(tempFilePath); } /** * 获取对应单元格样式等数据数据 * @param cell * @param tem * @param wbModule * @param tempFilePath * @return */ private Cell getCell(String cell, HashMap tem, XSSFWorkbook wbModule, String tempFilePath) { if(!cellMap.get(tempFilePath).containsKey(cell)){ Cell c = new Cell(); int[] pos = ExcelUtil.getPos(tem, cell); if(pos.length>1){ c.setLine(pos[1]); } c.setColumn(pos[0]); c.setCellStyle((ExcelUtil.getStyle(tem, cell, wbModule))); cellMap.get(tempFilePath).put(cell, c); } return cellMap.get(tempFilePath).get(cell); } /** * 获取模板数据 * @param tempFilePath 模板文件路径 * @param sheet * @return * @throws IOException */ private HashMap getTemp(String tempFilePath, int sheet) throws IOException { if(!tempFileMap.containsKey(tempFilePath)){ tempFileMap.put(tempFilePath, ExcelUtil.getTemplateFile(tempFilePath)); cellMap.put(tempFilePath, new HashMap<String,Cell>()); } return tempFileMap.get(tempFilePath)[sheet]; } /** * 资源关闭 * @param tempFilePath 模板文件路径 * @param os 输出流 * @throws IOException * @throws FileNotFoundException */ public void writeAndClose(String tempFilePath,OutputStream os) throws FileNotFoundException, IOException{ if(getTempWorkbook(tempFilePath)!=null){ getTempWorkbook(tempFilePath).write(os); tempWorkbook.remove(tempFilePath); } if(getFileInputStream(tempFilePath)!=null){ getFileInputStream(tempFilePath).close(); tempStream.remove(tempFilePath); } } /** * 获得读取数据工作间 * @param tempFilePath * @param excelFile * @return * @throws IOException * @throws FileNotFoundException */ private XSSFWorkbook getDataWorkbook(String tempFilePath, File excelFile) throws FileNotFoundException, IOException { if(!dataWorkbook.containsKey(tempFilePath)){ dataWorkbook.put(tempFilePath, new XSSFWorkbook(new FileInputStream(excelFile))); } return dataWorkbook.get(tempFilePath); } /** * 读取数据后关闭 * @param tempFilePath */ public void readClose(String tempFilePath){ dataWorkbook.remove(tempFilePath); } public static void main(String args[]) throws IOException{ String tempFilePath = ExcelHandle.class.getResource("test.xlsx").getPath(); List<String> dataListCell = new ArrayList<String>(); dataListCell.add("names"); dataListCell.add("ages"); dataListCell.add("sexs"); dataListCell.add("deses"); List<Map<String,Object>> dataList = new ArrayList<Map<String,Object>>(); Map<String,Object> map = new HashMap<String, Object>(); map.put("names", "names"); map.put("ages", 22); map.put("sexs", "男"); map.put("deses", "测试"); dataList.add(map); Map<String,Object> map1 = new HashMap<String, Object>(); map1.put("names", "names1"); map1.put("ages", 23); map1.put("sexs", "男"); map1.put("deses", "测试1"); dataList.add(map1); Map<String,Object> map2 = new HashMap<String, Object>(); map2.put("names", "names2"); map2.put("ages", 24); map2.put("sexs", "女"); map2.put("deses", "测试2"); dataList.add(map2); Map<String,Object> map3 = new HashMap<String, Object>(); map3.put("names", "names3"); map3.put("ages", 25); map3.put("sexs", "男"); map3.put("deses", "测试3"); dataList.add(map3); ExcelHandle handle = new ExcelHandle(); handle.writeListData(tempFilePath, dataListCell, dataList, 0); List<String> dataCell = new ArrayList<String>(); dataCell.add("name"); dataCell.add("age"); dataCell.add("sex"); dataCell.add("des"); Map<String,Object> dataMap = new HashMap<String, Object>(); dataMap.put("name", "name"); dataMap.put("age", 11); dataMap.put("sex", "女"); dataMap.put("des", "测试"); handle.writeData(tempFilePath, dataCell, dataMap, 0); File file = new File("d:/data.xlsx"); OutputStream os = new FileOutputStream(file); //写到输出流并关闭资源 handle.writeAndClose(tempFilePath, os); os.flush(); os.close(); System.out.println("读取写入的数据----------------------------------%%%"); System.out.println("name:"+handle.getValue(tempFilePath, "name", 0, file)); System.out.println("age:"+handle.getValue(tempFilePath, "age", 0, file)); System.out.println("sex:"+handle.getValue(tempFilePath, "sex", 0, file)); System.out.println("des:"+handle.getValue(tempFilePath, "des", 0, file)); System.out.println("读取写入的列表数据----------------------------------%%%"); List<Map<String,Object>> list = handle.getListValue(tempFilePath, dataListCell, 0, file); for(Map<String,Object> data:list){ for(String key:data.keySet()){ System.out.print(key+":"+data.get(key)+"--"); } System.out.println(""); } handle.readClose(tempFilePath); } }
试试其它关键字
POI
EXCEL
读写文件
模板
同语言下
.
List 切割成几份 工具类
.
一行一行读取txt的内容
.
Java PDF转换成图片并输出给前台展示
.
java 多线程框架
.
double类型如果小数点后为零则显示整数否则保留两位小
.
将图片转换为Base64字符串公共类抽取
.
sqlParser 处理SQL(增删改查) 替换schema 用于多租户
.
JAVA 月份中的第几周处理 1-7属于第一周 依次类推 29-
.
java计算两个经纬度之间的距离
.
输入时间参数计算年龄
可能有用的
.
C#实现的html内容截取
.
List 切割成几份 工具类
.
SQL查询 多列合并成一行用逗号隔开
.
一行一行读取txt的内容
.
C#动态修改文件夹名称(FSO实现,不移动文件)
.
c# 移动文件或文件夹
.
c#图片添加水印
.
Java PDF转换成图片并输出给前台展示
.
网站后台修改图片尺寸代码
.
处理大图片在缩略图时的展示
laigous
贡献的其它代码
(
1
)
.
用POI与EXCEL模板读写文件
Copyright © 2004 - 2024 dezai.cn. All Rights Reserved
站长博客
粤ICP备13059550号-3