您的位置:首页 > 编程语言 > Java开发

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

2019-01-17 17:17 281 查看
版权声明:@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(); // 养成不用就关闭的好习惯
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐