Java操作Excel之POI:java读写excel文件以及打印设置

版权声明:@lingtouyang1997 https://blog.csdn.net/weixin_43209201/article/details/86528059

Java操作Excel之POI:java读写excel文件以及打印设置

POI的jar包下载地址:http://poi.apache.org/download.html

注意:项目中导入poi 4.0.1的jar包,其他版本不确保没有错误。

HSSFCellStyle.VERTICAL_CENTER没有定义的解决办法参考https://blog.csdn.net/weixin_43209201/article/details/86522238
HSSFCellStyle.ALIGN_LEFT、CENTER、RIGHT等没有定义的解决办法参考https://blog.csdn.net/weixin_43209201/article/details/86522115
HSSFCell.CELL_TYPE_STRING、BOOLEAN、NUMERIC等没有定义的解决办法参考https://blog.csdn.net/weixin_43209201/article/details/86519522

1、java写excel文件及对页面打印设置:

import static org.apache.poi.hssf.usermodel.HeaderFooter.fontSize;

import java.io.FileOutputStream;
import java.util.Calendar;
import java.util.Date;

import org.apache.poi.hssf.usermodel.HSSFFooter;
import org.apache.poi.hssf.usermodel.HSSFHeader;
import org.apache.poi.hssf.usermodel.HSSFPrintSetup;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.CreationHelper;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;
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.ss.util.CellRangeAddress;

public class Demo_Write {
	/**
	 * 使用poi创建并编辑excel文件
	 * 
	 * @author lingtouyang的csdn博客 ▄┻┳═一 ☆
	 *
	 */
	public static void main(String[] args) throws Exception {
		// 创建工作簿
		Workbook wb = new HSSFWorkbook(); // 定义一个新的工作簿
		// 创建sheet页
		Sheet sheet1 = wb.createSheet("第一个sheet页"); // 创建第一个sheet页
		Sheet sheet2 = wb.createSheet("第二个sheet页"); // 创建第二个sheet页
		// 创建单元行
		Row row1 = sheet1.createRow(0); // 创建第一行
		// 创建单元格
		Cell cell1 = row1.createCell(0); // 创建第一行第一个单元格,第一列
		Cell cell2 = row1.createCell(1); // 创建第一行第二个单元格
		Cell cell3 = row1.createCell(2); // 创建第一行第三个单元格
		Cell cell4 = row1.createCell(3); // 创建第一行第四个单元格
		Cell cell5 = row1.createCell(4); // 创建第一行第五个单元格
		Cell cell6 = row1.createCell(5); // 创建第一行第六个单元格
		Cell cell7 = row1.createCell(6); // 创建第一行第七个单元格

		// 给单元格设值
		cell1.setCellValue(1.2); // 给第一个单元格设置一个 数字类型的值(整型\浮点都可以)
		cell2.setCellValue(false); // 给第二个单元格设置一个 布尔类型的值
		cell3.setCellValue("这是一个字符串"); // 给第三个单元格设置一个 字符串类型的值
		// 创建一个时间类型的单元格
		cell4.setCellValue(new Date()); // 给第三个单元格设置一个new Date()时间类型(从1970.1.1开始的毫秒数 )
		cell5.setCellValue(Calendar.getInstance()); // 给单元格设置一个 Calendar.getInstance()日期类型的值
		// 使用指定时间样式给单元格设置一个 日期类型的值
		CreationHelper creationHelper = wb.getCreationHelper(); // wb的小工具,此处用来设置时间格式
		CellStyle cellStyle = wb.createCellStyle(); // 创建单元格样式类
		cellStyle.setDataFormat(creationHelper.createDataFormat().getFormat("yyyy-MM-dd HH:mm:ss"));// 设置时间格式

		cell6.setCellValue(new Date()); // 给单元格设置一个 new Date()日期类型的值
		cell6.setCellStyle(cellStyle); // 将设置好的时间样式应用到单元格

		cell7.setCellValue(Calendar.getInstance()); // 给单元格设置一个 Calendar.getInstance()日期类型的值
		cell7.setCellStyle(cellStyle); // 将设置好的时间样式应用到单元格

		// 创建单元行
		Row row2 = sheet1.createRow(1); // 创建第二行
		// 设置行高
		row2.setHeightInPoints(30);
		// 创建单元格
		Cell cell2_1 = row2.createCell(0); // 创建第一行第一个单元格,第一列
		Cell cell2_2 = row2.createCell(1); // 创建第一行第二个单元格
		Cell cell2_3 = row2.createCell(2); // 创建第一行第三个单元格
		Cell cell2_5 = row2.createCell(4); // 创建第一行第五个单元格
		Cell cell2_6 = row2.createCell(5); // 创建第一行第六个单元格
		Cell cell2_7 = row2.createCell(6); // 创建第一行第七个单元格
		// 单元格设置
		// 设置单元格对齐方式,以左上为例
		cell2_1.setCellValue("左上对齐");// 给第二行第一列设值
		CellStyle cellStyle2 = wb.createCellStyle();// 创建单元格样式
		cellStyle2.setAlignment(HorizontalAlignment.LEFT);// 设置单元格水平方向对齐格式,以左对齐为例,其他类似
		cellStyle2.setVerticalAlignment(VerticalAlignment.TOP);// 设置单元格垂直对齐方式,以顶端对齐为例,其他类似
		cell2_1.setCellStyle(cellStyle2);// 注意:给单元格设置样式
		// 设置单元格边框
		cellStyle2.setBorderBottom(BorderStyle.DASH_DOT);// 下边框点线,其他类似
		cellStyle2.setBottomBorderColor(IndexedColors.GREEN.getIndex());// 为下边框设置颜色,其他类似
		// 设置单元格填充色和颜色
		cell2_2.setCellValue("背景色");
		CellStyle cellStyle3=wb.createCellStyle();
		cellStyle3.setFillPattern(FillPatternType.SPARSE_DOTS);//设置背景填充模式
		cellStyle3.setFillForegroundColor(IndexedColors.GOLD.getIndex());//设置单元格背景色
		cell2_2.setCellStyle(cellStyle3);
		//合并单元格
		cell2_3.setCellValue("合并单元格测试测试测试");
		sheet1.addMergedRegion(new CellRangeAddress(//设置第二行第三列到第四列的单元格进行合并如下:
				1,	//起始行
				1,	//结束行
				2, 	//起始列
				3	//结束列
				));
		//单元格字体设置
		Font font=wb.createFont();	//创建一个字体处理类
		font.setFontHeightInPoints((short) 30); 	//设置字体大小
		font.setFontName("黑体");		//设置字体
		font.setItalic(true);		//设置斜体
		font.setBold(false); 		//是否加粗
		font.setColor(IndexedColors.BLUE.getIndex()); 	//设置字体颜色
		font.setStrikeout(true);	//删除线
		
		CellStyle cellStyle4=wb.createCellStyle();//创建样式
		cellStyle4.setFont(font);//将字体样式应用到样式
		cell2_5.setCellValue("设置字体样式");
		cell2_5.setCellStyle(cellStyle4);//将样式应用到单元格
		//单元格使用换行,同excel中的Alt+Enter换行
		CellStyle cellStyle5=wb.createCellStyle();
		cellStyle5.setWrapText(true);//设置可以换行
		cell2_6.setCellValue("换行  \n 成功了!");
		cell2_6.setCellStyle(cellStyle5);
		//用户自定义单元格数据格式
		CellStyle cellStyle6=wb.createCellStyle();
		cellStyle6.setDataFormat(wb.createDataFormat().getFormat("#,##0.000"));
		cell2_7.setCellValue(11111111.1);
		cell2_7.setCellStyle(cellStyle6);
		
		//打印设置
		HSSFPrintSetup hps=(HSSFPrintSetup) sheet1.getPrintSetup();//获取页面的打印设置
		hps.setPaperSize((short) 9);//设置a4纸
		hps.setPaperSize(HSSFPrintSetup.A4_PAPERSIZE);//设置a4纸
		hps.setFitHeight((short)10);//设置缩放为10行高
		hps.setFitWidth((short)9);//设置列宽
		hps.setLandscape(true);//将页面设置为横向打印
		hps.setLeftToRight(true);//设置打印顺序先行后列,默认为先列后行
		sheet1.setHorizontallyCenter(true);//设置打印页面水平居中
		sheet1.setVerticallyCenter(true);//设置打印页面垂直居中
		//设置页眉
		HSSFHeader header=(HSSFHeader) sheet1.getHeader();
		header.setCenter("居中页眉");//设置页眉居中,其他类似
		fontSize((short) 16);
		//设置页脚
		HSSFFooter footer=(HSSFFooter) sheet1.getFooter();
		footer.setRight("Page " + HSSFFooter.page() + " of " + HSSFFooter.numPages());
		//使得一个sheet适合一页
		sheet1.setAutobreaks(true);
		//设置每页打印的行数
		sheet1.setAutobreaks(false);
		int i=sheet1.getLastRowNum();
		if(i!=0 && i%1==0) {
			sheet1.setRowBreak(i);//设置每一行分页打印
		}
		//设置重复打印(适合设置打印标题)
		sheet1.setRepeatingRows(new CellRangeAddress(0,1,0,7));//前两行的前八列重复打印
		//设置放大属性(参数为百分数的整型数。例如下面设置为75%)
		sheet1.setZoom(75);
		//调整单元格宽度
		sheet1.setColumnWidth(7, 20);//设置第八列宽20
		//设置不显示excel网格线
		sheet1.setDisplayGridlines(false);
		
		FileOutputStream fileOutStream = new FileOutputStream("G:\\用POI搞出来的工作簿.xlsx"); // 创建输出流
		wb.write(fileOutStream); // 将工作簿写到输出流中去
		System.out.println("操作结束!");
		if (null != fileOutStream) {
			fileOutStream.close(); // 及时关闭输出流
		}
		if (null != wb) {
			wb.close(); //养成不用就关闭的好习惯
		}
	}
}

2、java读excel文件:

  • 手动定制读取方式:
import java.io.FileInputStream;
import java.io.InputStream;
import java.text.SimpleDateFormat;

import org.apache.poi.hssf.usermodel.HSSFCell;
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.poifs.filesystem.POIFSFileSystem;

/**
 * 使用poi遍历excel文件
 * 
 * @author lingtouyang的csdn博客 ▄┻┳═一 ☆
 *
 */
public class Demo_Read {

	public static void main(String[] args) throws Exception {

		/**
		 * 手动定制读取excel文件内容
		 */

		InputStream is = new FileInputStream("G:\\用POI搞出来的工作簿.xlsx");// 文件输入流,传要遍历文件的路径
		POIFSFileSystem fs = new POIFSFileSystem(is);
		HSSFWorkbook wb = new HSSFWorkbook(fs);

		// 遍历sheet页
		for (int sheetNum = 0; sheetNum < wb.getNumberOfSheets(); sheetNum++) {
			HSSFSheet hssfSheet = wb.getSheetAt(sheetNum); /// 获取第一个Sheet页
			System.out.println(wb.getSheetName(sheetNum));
			if (hssfSheet == null) {
				continue;
			}
			// 遍历行Row
			for (int rowNum = 0; rowNum <= hssfSheet.getLastRowNum(); rowNum++) {
				HSSFRow hssfRow = hssfSheet.getRow(rowNum);
				if (hssfRow == null) {
					continue;
				}
				// 遍历列Cell
				for (int cellNum = 0; cellNum <= hssfRow.getLastCellNum(); cellNum++) {
					HSSFCell hssfCell = hssfRow.getCell(cellNum);
					if (hssfCell == null) {
						continue;
					}
					System.out.print(" " + getValue(hssfCell));
				}
				System.out.println();
			}
		}
		if (null != is) {
			is.close(); // 及时关闭输入流
		}
		if (null != wb) {
			wb.close(); // 养成不用就关闭的好习惯
		}
	}

	/**
	 * 获取单元格的值并根据类型格式化
	 * 
	 * @param cell
	 * @return
	 */
	private static String getValue(HSSFCell cell) {
		// 如果是yyyy-MM-dd
		// HH:mm:ss日期类型格式,返回相同的日期格式。由于我的Demo_Write中设置了是这种格式,故此处这样处理。同理,当然还可是其他格式,可根据实际情况调整
		if ("yyyy/mm;@".equals(cell.getCellStyle().getDataFormatString())
				|| "yyyy-MM-dd HH:mm:ss".equals(cell.getCellStyle().getDataFormatString())) {
			return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(cell.getDateCellValue());
		} else {
			switch (cell.getCellType()) {
			case BOOLEAN: // Boolean类型的处理
				return String.valueOf(cell.getBooleanCellValue());
			case NUMERIC: // 数字类型的处理
				return String.valueOf(cell.getNumericCellValue());
			default: // 其他类型则按字符串处理
				return String.valueOf(cell.getStringCellValue());
			}
		}
	}

}


  • 使用ExcelExtractor抽取excel文件中的文本:
import java.io.FileInputStream;
import java.io.InputStream;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.hssf.extractor.ExcelExtractor;

public class Demo_ReadByExcelExtractor {
	/**
	 * 使用poi遍历excel文件
	 * 
	 * @author lingtouyang的csdn博客 ▄┻┳═一 ☆
	 *
	 */
	public static void main(String[] args) throws Exception {

		/*
		 * 使用ExcelExtractor抽取excel文件中的文本
		 */
		InputStream is = new FileInputStream("G:\\用POI搞出来的工作簿.xlsx");// 文件输入流,传要遍历文件的路径
		POIFSFileSystem fs = new POIFSFileSystem(is);
		HSSFWorkbook wb = new HSSFWorkbook(fs);

		ExcelExtractor excelExtractor = new ExcelExtractor(wb);
		excelExtractor.setIncludeSheetNames(false); // 设置不显示sheet页的名字,还有一些设置项,可根据实际需要查阅api
		System.out.println(excelExtractor.getText());

		if (null != excelExtractor) {
			excelExtractor.close(); // 养成用完就关闭的好习惯
		}
		if (null != is) {
			is.close(); // 及时关闭输入流
		}
		if (null != wb) {
			wb.close(); // 养成不用就关闭的好习惯
		}
	}

}


猜你喜欢

转载自blog.csdn.net/weixin_43209201/article/details/86528059