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 ...
随机推荐
- [开发笔记]yum错误
yum 错误TypeError: rpmdb open failed 解决办法 是因为RPM数据库出现损坏导致的,它导致所有的软件的升级.安装甚至是删除都会出现问题,终端出现乱码,YUMEX也用不成, ...
- ResponsibleChain(责任链模式)
/** * 责任链模式 * @author TMAC-J * 老板讲任务交给CTO,CTO自然不会亲自去做,又把人物分配给项目经理,项目经理再把任务分配给组长,组长再分配给个人 * 如果中途哪个环节出 ...
- 笔记:Memory Notification: Library Cache Object loaded into SGA
笔记:Memory Notification: Library Cache Object loaded into SGA在警告日志中发现一些这样的警告信息:Mon Nov 21 14:24:22 20 ...
- 二次剩余、三次剩余、k次剩余
今天研究了一下这块内容...首先是板子 #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- 集成基于OAuth协议的单点登陆
在之前的一篇文章中,我们已经介绍了如何为一个应用添加对CAS协议的支持,进而使得我们的应用可以与所有基于CAS协议的单点登陆服务通讯.但是现在的单点登陆服务实际上并不全是通过实现CAS协议来完成的.例 ...
- H5图片上传插件
基于zepto,支持多文件上传,进度和图片预览,用于手机端. (function ($) { $.extend($, { fileUpload: function (options) { var pa ...
- wp已死,metro是罪魁祸首!
1.这篇文章肯定会有类似这样的评论:“我就是喜欢wp,我就是喜欢metro,我就是软粉“等类似的信仰论者发表的评论. 2.2014年我写过一篇文章,windows phone如何才能在中国翻身? 我现 ...
- ASP.NET Web API 控制器执行过程(一)
ASP.NET Web API 控制器执行过程(一) 前言 前面两篇讲解了控制器的创建过程,只是从框架源码的角度去简单的了解,在控制器创建过后所执行的过程也是尤为重要的,本篇就来简单的说明一下控制器在 ...
- ASP.NET Identity入门系列教程(一) 初识Identity
摘要 通过本文你将了解ASP.NET身份验证机制,表单认证的基本流程,ASP.NET Membership的一些弊端以及ASP.NET Identity的主要优势. 目录 身份验证(Authentic ...
- Entity Framework 6 Recipes 2nd Edition(13-4)译 -> 有效地创建一个搜索查询
问题 你想用LINQ写一个搜索查询,能被转换成更有效率的SQL.另外,你想用EF的CodeFirst方式实现. 解决方案 假设你有如下Figure 13-6所示的模型 Figure 13-6. A s ...