Java——poi操作Excel

Java——poi操作Excel

应用的poi.jar包版本为:3.16

1、读取xlsx

(1)、写读Excel类

package poi;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Iterator;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class ReadExcel2 {
	// 读取xlsx的数据
	public static String readDataExcelx(String filePath) throws IOException{
		StringBuilder str = new StringBuilder();
		FileInputStream input = null;
		try {
			// 打开filePath这个路径下指定的文件
			input = new FileInputStream(filePath);
			XSSFWorkbook workbook = new XSSFWorkbook(input);
			// 获取第一个sheet
			XSSFSheet sheet0 = workbook.getSheetAt(0);
			// 迭代行
			for (Iterator<Row> rowIterator = sheet0.iterator(); rowIterator.hasNext();) {
				XSSFRow row = (XSSFRow) rowIterator.next();
				// 迭代一行中所有的列
				for (Iterator<Cell> iterator = row.cellIterator(); iterator.hasNext();) {
					XSSFCell cell = (XSSFCell) iterator.next();
					// 根据单元的的类型 读取相应的结果
					if (cell.getCellTypeEnum() == CellType.STRING)
						str.append(cell.getStringCellValue() + "\t");
					else if (cell.getCellTypeEnum() == CellType.NUMERIC)
						str.append(cell.getNumericCellValue() + "\t");
					else if (cell.getCellTypeEnum() == CellType.FORMULA)
						str.append(cell.getCellFormula() + "\t");

				}
				// 换行
				str.append("\n");
			}

		} catch (Exception e) {
			// 上抛异常
			throw new IOException(e);
		} finally {
			if(input!=null){
				try {
					// 关闭输入流
					input.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		// 返回数据的字符串
		return str.toString();
	}

	// 测试读入的数据
	public static void main(String[] args) {
		String str;
		try {
			str = readDataExcelx("d:\\测试.xlsx");
			System.out.println(str);
		} catch (IOException e) {		
			e.printStackTrace();
		}
		
	}
}

(2)、显示效果

2、写入Xlsx

创建一个WriteExcel类,书写以下几个方法

package poi;
public class WriteExcel {
    // 设置边框方法
    public static void setBorder(){}
    // 设置字体方法
    public static void getFont(){}
    // 设置下拉框方法
    public static XSSFSheet setXSSFDropdown(){}
    // 创建Excel方法
	public static void createXlsx(){}
    // 测试main方法
    public static void main(String[] args) {}
}
    

因为写入内容过多,所以将写入拆分成几块

(1)、设置边框方法

/**
	 * ---------------------设置边框---------------------------
	 * @param cellStyle		表格类型对象
	 * @param topBorder		设置上边框
	 * @param bottomBorder	设置下边框
	 * @param leftBorder	设置左边框
	 * @param rightBorder	设置右边框
	 * @param borderStyle	设置边框类型
	 */
	public static void setBorder(CellStyle cellStyle, boolean topBorder, boolean bottomBorder, boolean leftBorder,
			boolean rightBorder, BorderStyle borderStyle) {
		// 如果borderStyle为空,则设置为无样式
		if(borderStyle==null){
			borderStyle=BorderStyle.NONE;
		}
		if (topBorder) {
			cellStyle.setBorderTop(borderStyle);
		}
		if (bottomBorder) {
			cellStyle.setBorderBottom(borderStyle);
		}
		if (leftBorder) {
			cellStyle.setBorderLeft(borderStyle);
		}
		if (rightBorder) {
			cellStyle.setBorderRight(borderStyle);
		}
	}

(2)、设置字体方法

/**
	 * -----------------获得字体以及配置字体类型---------------------
	 * @param workbook  Excel对象
	 * @param fontName  字体名
	 * @param fontSize  字体大小
	 * @param fontColor 字体颜色
	 * @param bold 		加粗
	 * @param italic	倾斜
	 * @param Underline	下划线
	 * @return			返回字体
	 */
	public static XSSFFont getFont(XSSFWorkbook workbook, String fontName, int fontSize, int[] fontColor, boolean bold,
			boolean italic,int Underline) {
		// 创建字体对象
		if (workbook == null) {
			throw new RuntimeException("workbook值为空");
		}
		XSSFFont font = workbook.createFont();
		// 设置字体名字
		if (fontName != null) {
			font.setFontName(fontName);
		}
		// 设置字体颜色
		if (fontColor != null) {
			XSSFColor color = new XSSFColor();
			color.setRGB(new byte[] { (byte) fontColor[0], (byte) fontColor[1], (byte) fontColor[2] });
			font.setColor(color);
		}
		// 设置字体大小
		if (fontSize > 0) {
			font.setFontHeightInPoints((short) fontSize);
		}
		// 设置字体加粗
		font.setBold(bold);
		// 设置字体倾斜
		font.setItalic(italic);
		// 设置字体下划线
		font.setUnderline((byte)Underline);
		// 返回字体
		return font;
	}

(3)、设置下拉框方法

    /**
	 * -----------------设置下拉框---------------------------
	 * @param sheetlist	 要设置的sheet.
	 * @param textlist	 下拉框显示的内容
	 * @param firstRow	 开始行
	 * @param endRow 	 结束行
	 * @param firstCol 	 开始列
	 * @param endCol 	 结束列
	 * @return 			 设置好的sheet.
	 */
	public static XSSFSheet setXSSFDropdown(XSSFSheet sheetlist, String[] textlist, int firstRow, int endRow,
			int firstCol, int endCol) {
		// 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列
		CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol);
		// 数据有效性对象
		XSSFDataValidationHelper dvHelper = new XSSFDataValidationHelper(sheetlist);
		XSSFDataValidationConstraint dvConstraint = (XSSFDataValidationConstraint) dvHelper.createExplicitListConstraint(textlist);
		XSSFDataValidation validation = (XSSFDataValidation) dvHelper.createValidation(dvConstraint, regions);
		sheetlist.addValidationData(validation);
		return sheetlist;
	}

(4)、生成表格的主方法

/**
	 * 
	 * @param filepath      要创建的xlsx文件目录
	 * @param list			Object[]数据列表
	 */
	public static void createXlsx(String filepath, List<Object[]> list) throws IOException {
		// -------------------创建Excel---------------------
		// Excel对象
		XSSFWorkbook workbook = new XSSFWorkbook();
		// 创建一个sheet0
		XSSFSheet sheet0 = workbook.createSheet("产品清单");
	
		// -------------------配置表格类型---------------------
		// 创建表格类型对象
		CellStyle cellStyle=workbook.createCellStyle();
		
		/*
		 * CellStyle.BORDER_DOUBLE 双边线 
		 * CellStyle.BORDER_THIN 细边线
		 * CellStyle.BORDER_MEDIUM 中等边线 
		 * CellStyle.BORDER_DASHED 虚线边线
		 * CellStyle.BORDER_HAIR 小圆点虚线边线
		 * CellStyle.BORDER_THICK 粗边线
		 */
		// 调用方法setBorder设置表格类型的底边框
		setBorder(cellStyle,true, true, true, true, BorderStyle.DASHED);
		
		// 调用方法getFont获得字体对象getFont
		// ("workbook对象","字体","字体大小","颜色数组(255,255,255),"加粗","倾斜","下划线(0为没下划线)")
		XSSFFont font = getFont(workbook, "微软雅黑", 10, new int[] { 255, 0, 0 }, false, false, 0);
		// 将字体加入到表格类型中
		cellStyle.setFont(font);
		
		// 设置内容居中
		cellStyle.setAlignment(HorizontalAlignment.CENTER);
		
		// -------------------创建表头---------------------
		// 设置表头要显示的内容
		String[] title = { "编号", "产品名称", "产品价格", "产品数量", "生产日期" };
		// 创建第一行(第一行为标号为0)
		XSSFRow row0 = sheet0.createRow((short) 0);
		// 循环创建第一行表格(第一列标号为0,i=开始的列,title.length-1=结束的列)
		for (int i = 0; i <= title.length - 1; i++) {
			// 创建表格对象
			XSSFCell cell = row0.createCell(i);
			// 设置表格类型
			cell.setCellStyle(cellStyle);
			// 设置表格对象值
			cell.setCellValue(title[i]);
			// 想合并最后的单元格,则判到最后列后合并单元格
			if (i == title.length - 1) {
				// 创建表格对象
				row0.createCell(i + 1).setCellStyle(cellStyle);
				// 合并单元格CellRangeAddress(开始行,结束行, 开始列, 结束列)
				row0.getSheet().addMergedRegion(new CellRangeAddress(0, 0, i, i + 1));
			}
		}

		// -------------------创建内容--------------------
		//设置下拉选项的菜单
		String[] dropdownList = { "产品1号", "产品2号", "产品3号" ,"产品4号" };
		
		// 循环生成行N行
		for (int rownum = 1; rownum <= list.size() - 1; rownum++) {
			// 创建行对象
			XSSFRow row = sheet0.createRow((short) rownum);
			// 循环生成行表格
			for (int colnum = 0; colnum <= list.get(rownum).length - 1; colnum++) {
				// 创建表格对象
				XSSFCell cells = row.createCell(colnum);
				// 设置表格类型
				cells.setCellStyle(cellStyle);
				// 从集合中提取数据
				cells.setCellValue((String) list.get(rownum - 1)[colnum]);
				// 判断是否是第二列,是则加入下拉列表
				if (colnum == 1) {
					//调用方法setXSSFDropdown创建下拉列表
					setXSSFDropdown(sheet0, dropdownList, rownum, rownum, colnum, colnum);
				}
				// 想合并最后的单元格,则判到最后列后合并单元格
				if (colnum == title.length - 1) {
					// 创建表格对象
					row.createCell(colnum + 1).setCellStyle(cellStyle);
					// 合并单元格CellRangeAddress(开始行,结束行, 开始列, 结束列)
					row.getSheet().addMergedRegion(new CellRangeAddress(rownum, rownum, colnum, colnum + 1));
				}
			}
		}

		// 创建输出流
		FileOutputStream out = new FileOutputStream(filepath);
		BufferedOutputStream bos = new BufferedOutputStream(out);

		// 写入文件到缓冲流中输出
		workbook.write(bos);
		bos.close();
	}

(4)、测试的main方法

    // 测试
	public static void main(String[] args) {
		try {
			// 创建测试用的数据
			List<Object[]> list = new ArrayList<Object[]>();
			list.add(new Object[] { "001", "产品1号", "1000.0", "20", "2017-07-11" });
			list.add(new Object[] { "002", "产品2号", "1200.0", "55", "2017-07-12" });
			list.add(new Object[] { "003", "产品3号", "1350.0", "42", "2017-07-13" });
			list.add(new Object[] { "004", "产品4号", "1400.0", "99", "2017-07-14" });
			// 设置保存目录
			String filepath="d://test.xlsx";
			// 调用法法
			createXlsx(filepath, list);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

(5)、显示效果

3、修改Xlsx

(1)、修改生成的test.xlsx文件

往其中插入一行

package poi;

import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class ModifyExcel {
	public static void Modify(String filepath) throws IOException {
		FileInputStream input = null;
		FileOutputStream out = null;
		try {
			// ------读取Excel到Java中-------
			input = new FileInputStream(filepath);
			XSSFWorkbook workbook = new XSSFWorkbook(input);

			// ------获得Excel中第1个表-------
			XSSFSheet sheet = workbook.getSheetAt(0);

			// ------把已有的行往下移动--------
			// 设置要移动的是第几行
			int n = 2;
			// sheet.getLastRowNum()为获取最后一行
			// shiftRows(开始行,结束行,移动多少行,是否保留行高,重新设置行高);
			for (int i = sheet.getLastRowNum(); i >= n; i--) {
				sheet.shiftRows(i, i, 1, true, false);
			}

			// ------插入行--------
			// 设置要插入的数据
			String[] data = new String[] { "001", "产品1号", "1000.0", "20", "2017-07-11" };
			// 在第N行插入一行
			XSSFRow row = sheet.createRow(n);
			// 循环创建表格
			for (int i = 0; i <= data.length - 1; i++) {
				XSSFCell cell=row.createCell(i);
				// 如果是最后的单元格,则判到最后列后合并单元格
				if (i == data.length - 1) {
					// 创建表格对象
					row.createCell(i);
					// 合并单元格CellRangeAddress(开始行,结束行, 开始列, 结束列)
					row.getSheet().addMergedRegion(new CellRangeAddress(n, n, i, i + 1));
				}
				cell.setCellValue(data[i]);
			}

			// ------创建输出流--------
			out = new FileOutputStream(filepath);
			BufferedOutputStream bos = new BufferedOutputStream(out);

            // ------写入到流--------
			workbook.write(bos);
		} catch (IOException e) {
			throw new IOException(e);
		} finally {
            // ------关闭流--------
			if(input!=null){
				input.close();
			}
			if(out!=null){
				out.close();
			}
		}
	}

	public static void main(String[] args){
		try {
			Modify("d:\\test.xlsx");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

(2)、显示效果

转载于:https://my.oschina.net/u/3523885/blog/1489098

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值