JAVA 读写Excel
ExcelUtil.java
package pers.kangxu.datautils.utils; import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map; import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.CellValue;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.FormulaEvaluator;
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; /**
*
* <b>
* excel 工具
* </b>
* @author kangxu
*
*/
public class ExcelUtil { /**
* 导出 excel
* @param filePath 文件全路径
* @param sheetName sheet页名称
* @param sheetIndex 当前sheet下表 从0开始
* @param fileHeader 头部
* @param datas 内容
*/
public static void writeExcel(String filePath,String sheetName,
int sheetIndex,
String[] fileHeader,
List<String[]> datas){
// 创建工作簿
Workbook wb = new HSSFWorkbook();
// 创建工作表 sheet
Sheet s = wb.createSheet(); wb.setSheetName(sheetIndex, sheetName); Row r = s.createRow(0);
Cell c = null;
Font font = null;
CellStyle styleHeader = null;
CellStyle styleContent = null; //粗体
font = wb.createFont();
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
// 设置头样式
styleHeader = wb.createCellStyle();
styleHeader.setFont(font);
styleHeader.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框
styleHeader.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框
styleHeader.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
styleHeader.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框
// 设置内容样式
styleContent = wb.createCellStyle();
styleContent.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框
styleContent.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框
styleContent.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
styleContent.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框 //设置头
for(int i=0;i<fileHeader.length;){
c = r.createCell(i);
c.setCellStyle(styleHeader);
c.setCellValue(fileHeader[i]);
i++;
} //设置内容
for(int rownum=0;rownum<datas.size();){ // 行 row datas.size()
r = s.createRow(rownum+1); //创建行
for(int cellnum=0;cellnum<fileHeader.length;){
c = r.createCell(cellnum); c.setCellValue(datas.get(rownum)[cellnum]);
c.setCellStyle(styleContent);
cellnum++;
} rownum++;
} FileOutputStream out = null;
try {
// 创建文件或者文件夹,将内容写进去
if(FileUtil.createFile(new File(filePath))){
out = new FileOutputStream(filePath);
wb.write(out);
} } catch (Exception e) {
e.printStackTrace();
}finally {
try {
// 关闭流
if(out != null){
out.flush();
out.close();
}
} catch (IOException e) {
e.printStackTrace();
}
} } /**
* 读取 excel 文件内容
* @param filePath
* @param sheetIndex
*/
public static List<Map<String,String>> readExcel(String filePath,int sheetIndex){
List<Map<String,String>> mapList = new ArrayList<Map<String,String>>();
// 头
List<String> list = new ArrayList<String>();
// int cnt = 0;
int idx = 0; try {
InputStream input = new FileInputStream(filePath); //建立输入流
Workbook wb = null; wb = new HSSFWorkbook(input); // 获取sheet页
Sheet sheet = wb.getSheetAt(sheetIndex); Iterator<Row> rows = sheet.rowIterator();
while (rows.hasNext()) {
Row row = rows.next();
Iterator<Cell> cells = row.cellIterator(); Map<String,String> map = new HashMap<String,String>(); if(cnt == 0){ // 将头放进list中
while (cells.hasNext()) {
Cell cell = cells.next();
if(isContainMergeCell(sheet)){
cancelMergeCell(sheet);
}
list.add(getStringCellValue(cell));
}
cnt ++;
continue; }else {
while (cells.hasNext()) {
Cell cell = cells.next();
if(isContainMergeCell(sheet)){
cancelMergeCell(sheet);
}
// 区别相同的头
list = ListUtil.changeSameVal(list);
map.put(list.get(idx++), getStringCellValue(cell));
}
}
idx = 0;
mapList.add(map); }
return mapList;
} catch (IOException ex) {
ex.printStackTrace();
}
return null; } /**
* 合并单元格
* @param sheet 当前sheet页
* @param firstRow 开始行
* @param lastRow 结束行
* @param firstCol 开始列
* @param lastCol 结束列
*/
public static int mergeCell(Sheet sheet,int firstRow,int lastRow,int firstCol,int lastCol){
if(sheet == null){
return -1;
}
return sheet.addMergedRegion(new CellRangeAddress(firstRow, lastRow, firstCol, lastCol));
} /**
* 取消合并单元格
* @param sheet
* @param idx
*/
public static void cancelMergeCell(Sheet sheet){
int sheetMergeCount = sheet.getNumMergedRegions();
for(int idx = 0; idx < sheetMergeCount;){
CellRangeAddress range = sheet.getMergedRegion(idx); String val = getMergeCellValue(sheet,range.getFirstRow(),range.getLastRow());
// 取消合并单元格
sheet.removeMergedRegion(idx); for(int rownum=range.getFirstRow();rownum<range.getLastRow()+1;){
for(int cellnum=range.getFirstColumn();cellnum<range.getLastColumn()+1;){ sheet.getRow(rownum).getCell(cellnum).setCellValue(val); cellnum ++;
} rownum ++;
} idx++;
}
} /**
* 判断指定单元格是否是合并单元格
* @param sheet 当前sheet页
* @param firstRow 开始行
* @param lastRow 结束行
* @param firstCol 开始列
* @param lastCol 结束列
* @return
*/
public static boolean isMergeCell(Sheet sheet,
int row ,int column){ int sheetMergeCount = sheet.getNumMergedRegions();
for(int i = 0; i < sheetMergeCount;){
CellRangeAddress range = sheet.getMergedRegion(i); int firstColumn = range.getFirstColumn();
int lastColumn = range.getLastColumn();
int firstRow = range.getFirstRow();
int lastRow = range.getLastRow();
if(row >= firstRow && row <= lastRow){
if(column >= firstColumn && column <= lastColumn){
return true;
}
} i++;
}
return false;
} /**
* 判断sheet页中是否含有合并单元格
* @param sheet
* @return
*/
public static boolean isContainMergeCell(Sheet sheet){
if(sheet == null){
return false;
}
return sheet.getNumMergedRegions()>0 ? true : false;
} /**
* 获取指定合并单元的值
* @param sheet
* @param row
* @param column
* @return
*/
public static String getMergeCellValue(Sheet sheet,
int row ,int column){ int sheetMergeCount = sheet.getNumMergedRegions();
for(int i = 0; i < sheetMergeCount;){
CellRangeAddress range = sheet.getMergedRegion(i); int firstColumn = range.getFirstColumn();
int lastColumn = range.getLastColumn();
int firstRow = range.getFirstRow();
int lastRow = range.getLastRow();
if(row >= firstRow && row <= lastRow){
if(column >= firstColumn && column <= lastColumn){
Row fRow = sheet.getRow(firstRow);
Cell fCell = fRow.getCell(firstColumn); return getStringCellValue(fCell) ;
}
} i++;
} return null;
} /**
* 获取单元格的值
* @param cell
* @return
*/
public static String getStringCellValue(Cell cell) {
String strCell = "";
if(cell==null) return strCell;
switch (cell.getCellType()) {
case Cell.CELL_TYPE_STRING:
strCell = cell.getRichStringCellValue().getString().trim();
break;
case Cell.CELL_TYPE_NUMERIC:
strCell = String.valueOf(cell.getNumericCellValue());
break;
case Cell.CELL_TYPE_BOOLEAN:
strCell = String.valueOf(cell.getBooleanCellValue());
break;
case Cell.CELL_TYPE_FORMULA:
FormulaEvaluator evaluator = cell.getSheet().getWorkbook().getCreationHelper().createFormulaEvaluator();
evaluator.evaluateFormulaCell(cell);
CellValue cellValue = evaluator.evaluate(cell);
strCell = String.valueOf(cellValue.getNumberValue()) ;
break;
default:
strCell = "";
}
return strCell;
} }
调用方式如下
ExcelUtilTester.java
package pers.kangxu.datautils.test; import java.util.ArrayList;
import java.util.List; import pers.kangxu.datautils.utils.ExcelUtil; public class ExcelUtilTester { public static void main(String[] args) {
List<String[]> datas = new ArrayList<String[]>();
datas.add(new String[]{"狗熊","母","250"});
datas.add(new String[]{"猪粮","不明","251"});
//ExcelUtil.writeExcel("C:\\Users\\Administrator\\Desktop\\test\\test\\test.xls","sheet1",0, new String[]{"姓名","年龄","性别"}, datas); System.out.println(ExcelUtil.readExcel("C:\\Users\\Administrator\\Desktop\\test\\test\\test.xls", 0)); }
}
JAVA 读写Excel的更多相关文章
- C++读写EXCEL文件OLE,java读写excel文件POI 对比
C++读写EXCEL文件方式比较 有些朋友问代码的问题,将OLE读写的代码分享在这个地方,大家请自己看.http://www.cnblogs.com/destim/p/5476915.html C++ ...
- Java读写Excel之POI超入门
转自:http://rensanning.iteye.com/blog/1538591 Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给J ...
- Java读写Excel之POI超入门(转)
Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能.Apache POI ...
- Java 读写 excel 实战完全解析
本文微信公众号「AndroidTraveler」首发. 背景 时值毕业季,很多毕业生初入职场. 因此,这边也写了一些新手相关的 Android 技术点. 比如上一篇的 Android 开发你需要了解的 ...
- java读写excel文件
近期处理的数据规模比较大,正好又是统计合并的事情,想着借助excel就可以完成了,然后就了解了下java读取excel的事情. 读取的文件主要分两类:xls文件.xlsx文件.xls文件的相关操作用的 ...
- 利用java读写Excel文件
一.读取Excel文件内容 java 代码 public static String readExcel(File file){ StringBuffer sb = new StringBuffer( ...
- java读写excel文件( POI解析Excel)
package com.zhx.base.utils; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi ...
- Java读写Excel
<dependencies> <dependency> <groupId>org.apache.poi</groupId> <artifactId ...
- Java读写Excel文件,利用POI
直接看工具类代码吧, package com.example.demo.util; import com.example.demo.entity.ExcelDataVO; import org.apa ...
随机推荐
- 程序猿都没对象,JS竟然有对象?
现在做项目基本是套用框架,不论是网上的前端还是后端框架,也会寻找一些封装好的插件拿来即用,但还是希望拿来时最好自己过后再回过头了解里面的原理,学习里面优秀的东西,不论代码封装性,还是小到命名. 好吧, ...
- ComponentPattern (组合模式)
import java.util.LinkedList; /** * 组合模式 * * @author TMAC-J 主要用于树状结构,用于部分和整体区别无区别的场景 想象一下,假设有一批连锁的理发店 ...
- Android中的flexboxlayout布局
提到FlexboxLayout大家估计有点模糊,它是谷歌最近开源的一个android排版库,它的前身Flexbox是2009年W3C提出了一种新的布局,可以简便.完整.响应式的实现页面布局,Flexb ...
- ios 获取或修改网页上的内容
UIWebView是iOS最常用的SDK之一,它有一个stringByEvaluatingJavaScriptFromString方法可以将javascript嵌 入页面中,通过这个方法我们可 ...
- Prometheus 系统监控方案 一
最近一直在折腾时序类型的数据库,经过一段时间项目应用,觉得十分不错.而Prometheus又是刚刚推出不久的开源方案,中文资料较少,所以打算写一系列应用的实践过程分享一下. Prometheus 是什 ...
- 我的MYSQL学习心得(九) 索引
我的MYSQL学习心得(九) 索引 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类 ...
- 关于VS2015支持编译Linux程序的问题
现状 目前已经发布的VS2015中包括VS2015 Preview 以及 VS2015 CTP6,这两个版本均不支持直接编译C++代码为Linux程序,具体情况可以参考 Visual Studio 2 ...
- ASP.NET Identity入门系列教程(一) 初识Identity
摘要 通过本文你将了解ASP.NET身份验证机制,表单认证的基本流程,ASP.NET Membership的一些弊端以及ASP.NET Identity的主要优势. 目录 身份验证(Authentic ...
- ABP源码分析二十七:ABP.Entity Framework
IRepository:接口定义了Repository常见的方法 AbpRepositoryBase:实现了IRepository接口的常见方法 EfRepositoryBase:实现了AbpRepo ...
- java运行时获得泛型类型
引言 众所周知,java泛型最重要的特征是泛型擦除,所有泛型在编译时会转换成Object所以在java中运行时无法获得泛型的类型. 但是其实以上的规则是针对方法的内部变量的,如果是其他形式的泛型其实是 ...