java poi 4.1.2 操作excel说明

文章目录

      • 描述
      • 导包
      • excel写入
      • excel读取
      • 数据类型与多行多列

描述

  • poi是Apache下一款java语言excle高效读写工具,本博客将从读、写等方面做说明,xls(2007前版本)和xlsx(2007版本和此后),使用不同类,讲分开讲解,推荐使用xlsx,行数更多,相同数据,存储更小。

导包

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
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.hssf.util.HSSFColor.HSSFColorPredefined;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

excel写入

  • 2003版前模板excel生成
	/**
	 * 创建xls文件 2003前版本
	 * @param name
	 */
	public static void createExcel(String name) {
		try {
			FileOutputStream output = new FileOutputStream(name);
			HSSFWorkbook wkb = new HSSFWorkbook();
			HSSFSheet sheet = wkb.createSheet("节点列表");

			//设置样式
			HSSFCellStyle style = wkb.createCellStyle();
			style.setAlignment(HorizontalAlignment.CENTER);  //水平居中
			style.setVerticalAlignment(VerticalAlignment.CENTER);  //垂直居中
			
		    style.setFillPattern(FillPatternType.SOLID_FOREGROUND); // 设置填充模式,模式为全部前景色
			style.setFillForegroundColor(HSSFColorPredefined.YELLOW.getColor().getIndex());  // 设置前景色为黄色

			//创建行
			HSSFRow row2 = sheet.createRow(0);
			
			//创建单元格
			HSSFCell cell = row2.createCell(0);
			cell.setCellValue("ip");
			cell.setCellStyle(style);
			
			cell = row2.createCell(1);
			cell.setCellValue("端口");
			cell.setCellStyle(style);
			
			cell = row2.createCell(2);
			cell.setCellValue("用户名");
			cell.setCellStyle(style);
			
			cell = row2.createCell(3);
			cell.setCellValue("密码");
			cell.setCellStyle(style);
			
			cell = row2.createCell(4);
			cell.setCellValue("说明");
			cell.setCellStyle(style);
			
			wkb.write(output);
			output.flush();
			output.close();
			wkb.close();
		} catch (FileNotFoundException e) {
			log.error("未发现文件" + e);
		} catch (IOException e) {
			log.error("创建excel读取异常" + e);
		}
	}
  • 生成xlsx文件
	/**
	 * 创建xlsx文件 2007后版本
	 * @param name
	 */
	public static void createExcelXlsx(String name) {
		try {
			FileOutputStream output = new FileOutputStream(name);
			XSSFWorkbook workbook = new XSSFWorkbook();
			XSSFSheet  sheet = workbook.createSheet("节点列表");

			//设置样式
			XSSFCellStyle style = workbook.createCellStyle();
			style.setAlignment(HorizontalAlignment.CENTER);  //水平居中
			style.setVerticalAlignment(VerticalAlignment.CENTER);  //垂直居中

			style.setFillPattern(FillPatternType.SOLID_FOREGROUND); // 设置填充模式,模式为全部前景色
			style.setFillForegroundColor(HSSFColorPredefined.YELLOW.getColor().getIndex());  // 设置前景色为黄色

			//创建行
			XSSFRow  row2 = sheet.createRow(0);
			
			//创建单元格
			XSSFCell  cell = row2.createCell(0);
			cell.setCellValue("ip");
			cell.setCellStyle(style);
			
			cell = row2.createCell(1);
			cell.setCellValue("端口");
			cell.setCellStyle(style);
			
			cell = row2.createCell(2);
			cell.setCellValue("用户名");
			cell.setCellStyle(style);
			
			cell = row2.createCell(3);
			cell.setCellValue("密码");
			cell.setCellStyle(style);
			
			cell = row2.createCell(4);
			cell.setCellValue("说明");
			cell.setCellStyle(style);
			
			workbook.write(output);
			output.flush();
			output.close();
			workbook.close();
		} catch (FileNotFoundException e) {
			log.error("未发现文件" + e);
		} catch (IOException e) {
			log.error("创建excel读取异常" + e);
		}
	}

excel读取

  • 解析excle根据文件名后缀自动判断版本,执行不同实现类,true为新版本,false为旧版本。
	public static boolean checkVersion(String file) {
		if(file.matches("^.+\\.(?i)(xlsx)$")) {
			return true;
		}
		return false;
	}
  • 解析过程
	public static List readExcelSecond(String xlsPath) {
		try {
			List temp = new ArrayList<>();

			FileInputStream fileIn = new FileInputStream(xlsPath);
			Workbook wb = null;
			if (checkVersion(xlsPath))
				wb = new XSSFWorkbook(fileIn);  //xlsx
			else {
				wb = new HSSFWorkbook(fileIn);  //xls
			}

			Sheet sht0 = wb.getSheetAt(0);

			for (Row r : sht0) {
				if (r.getRowNum() >= 1) {
					
					//String 数据
					if ((r.getCell(0) != null) && (r.getCell(0).toString() != "")) {
						System.out.println(r.getCell(0).getStringCellValue().trim());
						temp.add(r.getCell(0).getStringCellValue().trim());
					}
					
					//number数据
					if ((r.getCell(1) != null) && (r.getCell(1).toString() != "")) {
						System.out.println((int) r.getCell(1).getNumericCellValue());
					}
					
					//未知数据类型数据
					if ((r.getCell(1) != null) && (r.getCell(1).toString() != "")) {
						System.out.println(r.getCell(1).toString());
					}
					
				}
			}
			fileIn.close();
			wb.close();
			
			return temp;
		} catch (Exception e) {
			log.error(e.toString(), e);
		}
		return null;
	}

数据类型与多行多列

  • 读取excle时,数字有很多类型设置,如金额、百分数等,展示数据和实际读取不一致,读取为原始数据,
  • 多行多列时,以合并后,第一行、第一列下标读取,后续行列读取为空。

你可能感兴趣的:(Java,poi,java)