1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > java 导入excel工具类_java Excel工具类 导入导出Excel数据

java 导入excel工具类_java Excel工具类 导入导出Excel数据

时间:2023-11-10 18:29:17

相关推荐

java 导入excel工具类_java Excel工具类 导入导出Excel数据

java Excel工具类,导入导出Excel数据,导入数据对合并表格有判断获取数据;

导出数据到Excel,Excel文件不存在会创建。

使用的是poi处理,兼容Excel。

对反射不够理解,目前先用map处理,后续想好了,再处理。

代码:

package com.gx.excel;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.lang.reflect.InvocationTargetException;

import java.text.SimpleDateFormat;

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.HSSFWorkbook;

import org.apache.poi.ss.usermodel.Cell;

import org.apache.poi.ss.usermodel.DateUtil;

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.usermodel.WorkbookFactory;

import org.apache.poi.ss.util.CellRangeAddress;

import org.apache.poi.xssf.usermodel.XSSFWorkbook;

/**

* @ClassName: ExcelUtilDeal

* @Description: Excel工具类,导入导出Excel数据

* @author zhoujie

* @date 7月21日 上午11:08:13

* @version V1.0

*/

public class ExcelUtilDeal {

public static void main(String[] args) {

//获取Excel文件数据

/*List> list = getExcelData("用户表1.xls", "用户表");

System.out.println("listsize:"+list.size());

for(Map map : list){

for (Object key : map.keySet()) {

System.out.println(key + " :" + map.get(key));

}

} */

//数据导出到Excel

List> list = new ArrayList<>();

String[] headers = {"用户名","密码","邮箱","性别","年龄"};

for (int i = 0; i < 2; i++) {

Map map = new HashMap<>();

for (int j = 0; j < headers.length; j++) {

map.put(headers[j], i+""+j+"");

}

list.add(map);

}

fillExcelData(list, "用户表1.xls", "用户表", headers);

}

/**

* 数据导出到Excel,单个Excel

* @param list 数据

* @param excelFile Excel文件:用户表.xlsx

* @param headers 行头标题字符串数组

* @param sheetname Excel的sheet名称

* @return int 导出数量

* @throws Exception

*/

public static int fillExcelData(List> list, String excelFile, String sheetname, String[] headers) {

// 无Excel文件先创建Excel文件,再读取Excel文件

String cpath = ExcelUtilDeal.class.getClassLoader().getResource("").getPath();

String rootPath = cpath.substring(0, cpath.indexOf("/WEB-INF/"));

File dirfile = new File(rootPath+"\\excel\\"); //判断文件夹是否存在

if(!dirfile.exists()){

dirfile.mkdirs(); //创建文件夹

}

String path = rootPath+"\\excel\\"+excelFile;

File file = new File(path);

FileOutputStream out = null;

FileInputStream fileinp = null;

Workbook wb = null;

try {

if(!file.exists()){ //判断文件是否存在

createExcel(path, sheetname, headers); //创建Excel文件

}

fileinp = new FileInputStream(file);

wb = WorkbookFactory.create(fileinp); //兼容模式打开Excel

Sheet sheet = wb.getSheet(sheetname); //获取sheet

Row row = null; //行

if(sheet == null){

sheet = wb.createSheet(sheetname); //创建sheet

row = sheet.createRow(0); //首行

// 先填充行头

for (int i = 0; i < headers.length; i++) {

row.createCell(i).setCellValue(headers[i]);

}

}

// 再填充数据

int rowIndex = 1;

Iterator> iterator = list.iterator();

while (iterator.hasNext()) {

row = sheet.createRow(rowIndex++);

Map map = iterator.next(); //获取对象

setRowCellValue(map, headers, row); //设置值

}

out = new FileOutputStream(path);

wb.write(out);

System.out.println("数据导出到Excel文件");

return rowIndex;

} catch (Exception e) {

e.printStackTrace();

} finally {

try {

wb.close();

fileinp.close();

out.close();

} catch (IOException e) {

e.printStackTrace();

}

}

return 0;

}

/**

* 设置Excel一行数据

* @param map 数据集合

* @param row Excel行

* @throws NoSuchMethodException

* @throws IllegalAccessException

* @throws IllegalArgumentException

* @throws InvocationTargetException

*/

public static void setRowCellValue(Map map, String[] headers, Row row) throws NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {

Object value = null;

for (int i = 0; i < headers.length; i++) {

value = map.get(headers[i]);

if(value instanceof Double){

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

value = sdf.format(value).toString();

}else if(value instanceof Boolean){

if((boolean) value){

value = "是";

}else{

value = "否";

}

}

row.createCell(i).setCellValue(value.toString()); //单元格值设置

}

}

/**

* 获取Excel文件数据

* 填充数据到excel文件

* @param excelFile Excel文件名称

* @return int 导入数量

* @throws Exception

*/

public static List> getExcelData(String excelFile, String sheetname) {

List> list = new ArrayList<>();

// 本地磁盘读取excel文件,然后读取sheet,再读取所有数据,循环sheet

FileInputStream fileinp = null;

Workbook wb = null;

try {

String cpath = ExcelUtilDeal.class.getClassLoader().getResource("").getPath();

String rootPath = cpath.substring(0, cpath.indexOf("/WEB-INF/"));

String path = rootPath+"\\excel\\"+excelFile;

File file = new File(path);

if(!file.exists()){

file.mkdirs();

}

fileinp = new FileInputStream(file);

wb = WorkbookFactory.create(fileinp); //兼容模式打开Excel

Sheet sheet = wb.getSheet(sheetname); //获取对应sheet

Row firstrow = sheet.getRow(0); //获取首行数据即标题;

int rows = sheet.getPhysicalNumberOfRows(); //获取sheet表格数据行数

int cells = firstrow.getPhysicalNumberOfCells();//获取表头单元格个数

String[] headers = new String[cells]; //行头

for (int i = 0; i < cells; i++) {

Cell firstrowCell = firstrow.getCell(i);

headers[i] = firstrowCell.getStringCellValue();

}

Row row; //初始化行

Cell cell; //初始化单元格

for (int i = 1; i < rows; i++) {

row = sheet.getRow(i); //从第二行开始读数据

Map map = new HashMap<>();

for (int j = 0; j < cells; j++) {

if(isMergedRegion(sheet, i, j)){ //判断是否是合并单元格

System.out.println("发现合并单元格");

cell = getMergedCell(sheet, row, j); //获取合并单元格

}else{

cell = row.getCell(j);

}

Object value = formatCellData(cell); //获取格式化单元格值

map.put(headers[j], value);

}

list.add(map);

}

System.out.println("获取Excel文件数据");

} catch (Exception e) {

e.printStackTrace();

} finally {

try {

wb.close();

fileinp.close();

} catch (Exception e) {

e.printStackTrace();

}

}

return list;

}

/**

* 创建新excel.

* @param fileDir excel的路径

* @param sheetName 要创建的表格索引

* @param headers excel的第一行即表格头

*/

public static void createExcel(String fileDir,String sheetName,String headers[]) {

//创建workbook

Workbook workbook = null;

try{

workbook = new HSSFWorkbook();

}catch(Exception e){

workbook = new XSSFWorkbook();

}

//添加Worksheet(不添加sheet时生成的xlsx文件打开时会报错)

workbook.createSheet(sheetName);

//输出流

FileOutputStream out = null;

try {

//添加表头

Row row = workbook.getSheet(sheetName).createRow(0); //sheet创建第一行

for(short i = 0;i < headers.length;i++){

row.createCell(i).setCellValue(headers[i]);

}

out = new FileOutputStream(fileDir); //创建文件

workbook.write(out); //写入sheet

System.out.println("创建Excel");

} catch (Exception e) {

e.printStackTrace();

} finally {

try {

workbook.close();

out.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

/**

* 返回格式化各类型单元格值

* @param cell 单元格

* @return Object 返回值

*/

@SuppressWarnings("deprecation")

public static Object formatCellData(Cell cell) {

if (cell == null) {

return "";

}

switch (cell.getCellType()) {

case Cell.CELL_TYPE_NUMERIC:

if (DateUtil.isCellDateFormatted(cell)) { // 日期

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

return sdf.format(DateUtil.getJavaDate(cell.getNumericCellValue())).toString();

}

return cell.getNumericCellValue(); // 数字

case Cell.CELL_TYPE_STRING: // 字符串

return cell.getStringCellValue();

case Cell.CELL_TYPE_FORMULA: // 公式

return cell.getCellFormula();

case Cell.CELL_TYPE_BLANK: // 空白

return "";

case Cell.CELL_TYPE_BOOLEAN: // 布尔取值

return cell.getBooleanCellValue();

case Cell.CELL_TYPE_ERROR: // 错误类型

return cell.getErrorCellValue();

}

return "";

}

/**

* 判断是否合并单元格

* 先获取所有合并单元格,通过传入行列索引判断是否在合并单元格内

* @param sheet

* @param row

* @param column

* @return

*/

public static boolean isMergedRegion(Sheet sheet, int row, int column) {

int sheetMergeCount = sheet.getNumMergedRegions();

for (int i = 0; i < sheetMergeCount; i++) {

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;

}

}

}

return false;

}

/**

* 获取合并单元格有值单元格

* 合并单元格值保存在第一个合并单元格内

* @param sheet

* @param row

* @param column

* @return

*/

public static Cell getMergedCell(Sheet sheet, Row row, int column) {

int sheetMergeCount = sheet.getNumMergedRegions();

Cell fCell = null;

int rowIndex = row.getRowNum();

for (int i = 0; i < sheetMergeCount; i++) {

CellRangeAddress ca = sheet.getMergedRegion(i);

int firstColumn = ca.getFirstColumn();

int lastColumn = ca.getLastColumn();

int firstRow = ca.getFirstRow();

int lastRow = ca.getLastRow();

if (rowIndex >= firstRow && rowIndex <= lastRow) {

if (column >= firstColumn && column <= lastColumn) {

Row fRow = sheet.getRow(firstRow);

fCell = fRow.getCell(firstColumn);

}

}

}

if (fCell == null) {

fCell = row.getCell(column);

}

return fCell;

}

/**

* 截取文件后缀

* @param path

* @return String 返回类型

*/

public static String getSuffix(String path) {

String substring = path.substring(path.lastIndexOf(".") + 1);

return substring;

}

}

说明:Excel文件导出在根目录下的excel目录。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。