本文目录一览:
- 1、用poi导出excel设置列宽的方法
- 2、如何使用poi进行excel单元格的查找和替换
- 3、poi操作excel表,怎么将单元格的格式设置为
- 4、POI 读取excel
- 5、使用poi读写excel
- 6、POI动态生成Excel
用poi导出excel设置列宽的方法
很多朋友都想知道poi导出excel设置列宽的 方法 ,那么,该怎么做呢,下面让我为你带来poi导出excel设置列宽的简单方法。
poi导出excel设置列宽步骤:
接下来 说说 sheet.setColumnWidth((short) 0, (short) 250);
第一个参数表示要为第几列设置,第二个参数表示列的宽度,看看上面的代码按说第一行第一列的单元格形状应该是个正方形,因为宽和高都是250,但是打开导出后的 Excel 发现宽度没有高度大,是个长方形,查看该列的宽度仅为7个像素,看来行高和列宽的单位是不一样的,同样换一算sheet.setColumnWidth((short) 0, (short) (35.7));表示高度为一个像素,同样设置列宽的像素为sheet.setColumnWidth((short) 0, (short) (35.7*n));//n为列高的像素数。
关于poi导出excel的相关 文章 推荐:
1. java简历模板
2. java简历填写范文3篇
如何使用poi进行excel单元格的查找和替换
参考spire.xls for java 的查找替换方法:
import com.spire.xls.CellRange;
mport com.spire.xls.ExcelVersion;
import com.spire.xls.Workbook;
import com.spire.xls.Worksheet;
public class ReplaceData {
public static void main(String[] args){
//创建Workbook实例
Workbook workbook = new Workbook();
//加载Excel文档
workbook.loadFromFile("Test.xlsx");
//获取第一个工作表
Worksheet worksheet = workbook.getWorksheets().get(0);
//查找工作表中的指定文字
CellRange[] ranges = worksheet.findAllString("合计", true, true);
for (CellRange range : ranges)
{
//替换为新文字
range.setText("替换");
}
//保存结果文档
workbook.saveToFile("ReplaceData.xlsx", ExcelVersion.Version2013);
}
}
参考自官网教程
poi操作excel表,怎么将单元格的格式设置为
通过poi导出excel的过程大致是这样的:
规定单元格的格式
↓
创建单元格
↓
设置单元格的格式
↓
设置数据的格式
↓
把数据存放到单元格中
↓
通过IO流输出
背景POI导出Excel时设置单元格类型为数值类型
要想存放数值的单元格以数值类型导出,其中最关键的步骤就是上面加粗的两步,设置单元格的格式和向单元格中存放数据。
核心代码如下:
/**
* 导出Excel-胡玉洋-2015年11月11日
*
*@param outPutParam Excel数据实体,包括要导出的excel标头、列标题、数据等
* */
private void createContentRows(ExcelParam outPutParam) {
HSSFWorkbook workbook=new HSSFWorkbook(); //创建一个Excel文件
// 遍历集合数据,产生数据行
for (int i = 0; i outPutParam.getContent().size(); i++) {
int rowIndex = i + 2;
HSSFRow contentRow = sheet.createRow(rowIndex);
MapString, Object rowDate = outPutParam.getContent().get(i);
//遍历列
for (int j = 0; j outPutParam.getTitleList().size(); j++) {
Title headTitle = outPutParam.getTitleList().get(j);//获取第i行第j列列标题
String headerName = headTitle.getName();//获取第j列列标识
Object data = rowDate.get(headerName);//获取第i行第j列所放数据
HSSFCellStyle contextstyle =workbook.createCellStyle();
HSSFCell contentCell = contentRow.createCell(j);
Boolean isNum = false;//data是否为数值型
Boolean isInteger=false;//data是否为整数
Boolean isPercent=false;//data是否为百分数
if (data != null || "".equals(data)) {
//判断data是否为数值型
isNum = data.toString().matches("^(-?//d+)(//.//d+)?$");
//判断data是否为整数(小数部分是否为0)
isInteger=data.toString().matches("^[-//+]?[//d]*$");
//判断data是否为百分数(是否包含“%”)
isPercent=data.toString().contains("%");
}
//如果单元格内容是数值类型,涉及到金钱(金额、本、利),则设置cell的类型为数值型,设置data的类型为数值类型
if (isNum !isPercent) {
HSSFDataFormat df = workbook.createDataFormat(); // 此处设置数据格式
if (isInteger) {
contextstyle.setDataFormat(df.getBuiltinFormat("#,#0"));//数据格式只显示整数
}else{
contextstyle.setDataFormat(df.getBuiltinFormat("#,##0.00"));//保留两位小数点
}
// 设置单元格格式
contentCell.setCellStyle(contextstyle);
// 设置单元格内容为double类型
contentCell.setCellValue(Double.parseDouble(data.toString()));
} else {
contentCell.setCellStyle(contextstyle);
// 设置单元格内容为字符型
contentCell.setCellValue(data.toString());
}
}
}
}123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
如上,有两个比较重要的点:
1、先用正则表达式判断数据是否为数值型,如果为数值型,则设置单元格格式为整数或者小数;
2、然后往单元格中存放数据的时候要设置数据的格式为double类型,如果查看poi的源码HSSFCell.java会发现设置数据的方法如下,所以用setCellValue(double)方法即可。
优化
到了这里,您可能以为万事大吉啊了,其实上面的代码有个陷阱,如果不经过大数据量的测试是发觉不出来的哦~~
如果数据量大的话,系统可能会报错“The maximum number of cell styles was exceeded. You can define up to 4000 styles in a .xls workbook”,原因是style创建的次数太多了,解决这个问题的方法很简单,在循环体外面创建单元格格式contextstyle(即把它当成一个“全局”变量),不要在循环内部创建。
正确的代码如下:
/**
* 导出Excel-胡玉洋-2015年11月11日
*
*@param outPutParam Excel数据实体,包括要导出的excel标头、列标题、数据等
* */
private void createContentRows(ExcelParam outPutParam) {
HSSFWorkbook workbook=new HSSFWorkbook(); //创建一个Excel文件
HSSFCellStyle contextstyle =workbook.createCellStyle();
// 遍历集合数据,产生数据行
for (int i = 0; i outPutParam.getContent().size(); i++) {
int rowIndex = i + 2;
HSSFRow contentRow = sheet.createRow(rowIndex);
MapString, Object rowDate = outPutParam.getContent().get(i);
//遍历列
for (int j = 0; j outPutParam.getTitleList().size(); j++) {
Title headTitle = outPutParam.getTitleList().get(j);//获取第i行第j列列标题
String headerName = headTitle.getName();//获取第j列列标识
Object data = rowDate.get(headerName);//获取第i行第j列所放数据
HSSFCell contentCell = contentRow.createCell(j);
Boolean isNum = false;//data是否为数值型
Boolean isInteger=false;//data是否为整数
Boolean isPercent=false;//data是否为百分数
if (data != null || "".equals(data)) {
//判断data是否为数值型
isNum = data.toString().matches("^(-?//d+)(//.//d+)?$");
//判断data是否为整数(小数部分是否为0)
isInteger=data.toString().matches("^[-//+]?[//d]*$");
//判断data是否为百分数(是否包含“%”)
isPercent=data.toString().contains("%");
}
//如果单元格内容是数值类型,涉及到金钱(金额、本、利),则设置cell的类型为数值型,设置data的类型为数值类型
if (isNum !isPercent) {
HSSFDataFormat df = workbook.createDataFormat(); // 此处设置数据格式
if (isInteger) {
contextstyle.setDataFormat(df.getBuiltinFormat("#,#0"));//数据格式只显示整数
}else{
contextstyle.setDataFormat(df.getBuiltinFormat("#,##0.00"));//保留两位小数点
}
// 设置单元格格式
contentCell.setCellStyle(contextstyle);
// 设置单元格内容为double类型
contentCell.setCellValue(Double.parseDouble(data.toString()));
} else {
contentCell.setCellStyle(contextstyle);
// 设置单元格内容为字符型
contentCell.setCellValue(data.toString());
}
}
}
}123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
POI 读取excel
直接上源码:
package edu.sjtu.erplab.poi;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
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;
/**
* 操作Excel表格的功能类
*/
public class ExcelReader {
private POIFSFileSystem fs;
private HSSFWorkbook wb;
private HSSFSheet sheet;
private HSSFRow row;
/**
* 读取Excel表格表头的内容
* @param InputStream
* @return String 表头内容的数组
*/
public String[] readExcelTitle(InputStream is) {
try {
fs = new POIFSFileSystem(is);
wb = new HSSFWorkbook(fs);
} catch (IOException e) {
e.printStackTrace();
}
sheet = wb.getSheetAt(0);
row = sheet.getRow(0);
// 标题总列数
int colNum = row.getPhysicalNumberOfCells();
System.out.println("colNum:" + colNum);
String[] title = new String[colNum];
for (int i = 0; i colNum; i++) {
//title[i] = getStringCellValue(row.getCell((short) i));
title[i] = getCellFormatValue(row.getCell((short) i));
}
return title;
}
/**
* 读取Excel数据内容
* @param InputStream
* @return Map 包含单元格数据内容的Map对象
*/
public MapInteger, String readExcelContent(InputStream is) {
MapInteger, String content = new HashMapInteger, String();
String str = "";
try {
fs = new POIFSFileSystem(is);
wb = new HSSFWorkbook(fs);
} catch (IOException e) {
e.printStackTrace();
}
sheet = wb.getSheetAt(0);
// 得到总行数
int rowNum = sheet.getLastRowNum();
row = sheet.getRow(0);
int colNum = row.getPhysicalNumberOfCells();
// 正文内容应该从第二行开始,第一行为表头的标题
for (int i = 1; i = rowNum; i++) {
row = sheet.getRow(i);
int j = 0;
while (j colNum) {
// 每个单元格的数据内容用"-"分割开,以后需要时用String类的replace()方法还原数据
// 也可以将每个单元格的数据设置到一个javabean的属性中,此时需要新建一个javabean
// str += getStringCellValue(row.getCell((short) j)).trim() +
// "-";
str += getCellFormatValue(row.getCell((short) j)).trim() + " ";
j++;
}
content.put(i, str);
str = "";
}
return content;
}
/**
* 获取单元格数据内容为字符串类型的数据
*
* @param cell Excel单元格
* @return String 单元格数据内容
*/
private String getStringCellValue(HSSFCell cell) {
String strCell = "";
switch (cell.getCellType()) {
case HSSFCell.CELL_TYPE_STRING:
strCell = cell.getStringCellValue();
break;
case HSSFCell.CELL_TYPE_NUMERIC:
strCell = String.valueOf(cell.getNumericCellValue());
break;
case HSSFCell.CELL_TYPE_BOOLEAN:
strCell = String.valueOf(cell.getBooleanCellValue());
break;
case HSSFCell.CELL_TYPE_BLANK:
strCell = "";
break;
default:
strCell = "";
break;
}
if (strCell.equals("") || strCell == null) {
return "";
}
if (cell == null) {
return "";
}
return strCell;
}
/**
* 获取单元格数据内容为日期类型的数据
*
* @param cell
* Excel单元格
* @return String 单元格数据内容
*/
private String getDateCellValue(HSSFCell cell) {
String result = "";
try {
int cellType = cell.getCellType();
if (cellType == HSSFCell.CELL_TYPE_NUMERIC) {
Date date = cell.getDateCellValue();
result = (date.getYear() + 1900) + "-" + (date.getMonth() + 1)
+ "-" + date.getDate();
} else if (cellType == HSSFCell.CELL_TYPE_STRING) {
String date = getStringCellValue(cell);
result = date.replaceAll("[年月]", "-").replace("日", "").trim();
} else if (cellType == HSSFCell.CELL_TYPE_BLANK) {
result = "";
}
} catch (Exception e) {
System.out.println("日期格式不正确!");
e.printStackTrace();
}
return result;
}
/**
* 根据HSSFCell类型设置数据
* @param cell
* @return
*/
private String getCellFormatValue(HSSFCell cell) {
String cellvalue = "";
if (cell != null) {
// 判断当前Cell的Type
switch (cell.getCellType()) {
// 如果当前Cell的Type为NUMERIC
case HSSFCell.CELL_TYPE_NUMERIC:
case HSSFCell.CELL_TYPE_FORMULA: {
// 判断当前的cell是否为Date
if (HSSFDateUtil.isCellDateFormatted(cell)) {
// 如果是Date类型则,转化为Data格式
//方法1:这样子的data格式是带时分秒的:2011-10-12 0:00:00
//cellvalue = cell.getDateCellValue().toLocaleString();
//方法2:这样子的data格式是不带带时分秒的:2011-10-12
Date date = cell.getDateCellValue();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
cellvalue = sdf.format(date);
}
// 如果是纯数字
else {
// 取得当前Cell的数值
cellvalue = String.valueOf(cell.getNumericCellValue());
}
break;
}
// 如果当前Cell的Type为STRIN
case HSSFCell.CELL_TYPE_STRING:
// 取得当前的Cell字符串
cellvalue = cell.getRichStringCellValue().getString();
break;
// 默认的Cell值
default:
cellvalue = " ";
}
} else {
cellvalue = "";
}
return cellvalue;
}
public static void main(String[] args) {
try {
// 对读取Excel表格标题测试
InputStream is = new FileInputStream("d://test2.xls");
ExcelReader excelReader = new ExcelReader();
String[] title = excelReader.readExcelTitle(is);
System.out.println("获得Excel表格的标题:");
for (String s : title) {
System.out.print(s + " ");
}
// 对读取Excel表格内容测试
InputStream is2 = new FileInputStream("d://test2.xls");
MapInteger, String map = excelReader.readExcelContent(is2);
System.out.println("获得Excel表格的内容:");
for (int i = 1; i = map.size(); i++) {
System.out.println(map.get(i));
}
} catch (FileNotFoundException e) {
System.out.println("未找到指定路径的文件!");
e.printStackTrace();
}
}
}
使用poi读写excel
首先了解以下excel文件怎么和poi中的组件对应起来的。
基于以上几条,如果想对excel文件进行读写的话就要
基于以上原理就可以轻松对Excel文件进行读写,这里以XSSFWorkbook(对应.xlsx文件即office2007以上版本,如果是.xls文件即office2003以下版本需要使用HSSFWorkbook)为例进行Excel的简单读写。
maven依赖
写操作
读操作和写操作类似,把create的地方换成get即可
当然也可以根据文件扩展名自动选择使用哪个子类生成Workbook对象,这里直接封一个util工具类,方便以后直接使用
POI动态生成Excel
项目功能里要求能够将展示的报表导出excel,因为报表的数据都是动态从list传进来的,所以使用了POI技术来动态构建excel文件。
百科里说POI是介个样子的
“ApachePOI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对MicrosoftOffice格式档案读和写的功能”
简单来说就是通过它的API可以进行创建/读取文档,sheet,行列单元格等操作,也可以设置文档的各个样式。
刚接触这个任务的时候查了很多资料,最后主要是参考了这篇文章,程序复制粘贴就跑得通,对POI的整个理解可以得到很好地提升。
详解JAVA POI导出EXCEL报表的操作(包括各种格式及样式的实现)
然后参考着就实现了项目里要求的样子啦
=======================================================
百科中的示例附上作为下次使用的备忘。
创建Excel 文档
示例1将演示如何利用Jakarta POI API 创建Excel 文档。
示例1程序如下:
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFCell;
import java .io.FileOutputStream;
public class CreateXL {
/** Excel 文件要存放的位置,假定在D盘下*/
public static String outputFile="D:/test.xls";
public static void main(String argv[]){
try{
// 创建新的Excel 工作簿
HSSFWorkbook workbook = new HSSFWorkbook();
// 在Excel工作簿中建一工作表,其名为缺省值
// 如要新建一名为"效益指标"的工作表,其语句为:
// HSSFSheet sheet = workbook.createSheet("效益指标");
HSSFSheet sheet = workbook.createSheet();
// 在索引0的位置创建行(最顶端的行)
HSSFRow row = sheet.createRow((short)0);
//在索引0的位置创建单元格(左上端)
HSSFCell cell = row.createCell((short) 0);
// 定义单元格为字符串类型
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
// 在单元格中输入一些内容
cell.setCellValue("增加值");
// 新建一输出文件流
FileOutputStream fOut = new FileOutputStream(outputFile);
// 把相应的Excel 工作簿存盘
workbook.write(fOut);
fOut.flush();
// 操作结束,关闭文件
fOut.close();
System.out.println("文件生成...");
}catch(Exception e) {
System.out.println("已运行 xlCreate() : " + e );
}
}
}
读取Excel文档中的数据
示例2将演示如何读取Excel文档中的数据。假定在D盘JTest目录下有一个文件名为test1.xls的Excel文件。
示例2程序如下:
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFCell;
import java .io.FileInputStream;
public class ReadXL {
/** Excel文件的存放位置。注意是正斜线*/
public static String fileToBeRead="D:/test1.xls";
public static void main(String argv[]){
try{
// 创建对Excel工作簿文件的引用
HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(fileToBeRead));
// 创建对工作表的引用。
// 本例是按名引用(让我们假定那张表有着缺省名"Sheet1")
HSSFSheet sheet = workbook.getSheet("Sheet1");
// 也可用getSheetAt(int index)按索引引用,
// 在Excel文档中,第一张工作表的缺省索引是0,
// 其语句为:HSSFSheet sheet = workbook.getSheetAt(0);
// 读取左上端单元
HSSFRow row = sheet.getRow(0);
HSSFCell cell = row.getCell((short)0);
// 输出单元内容,cell.getStringCellValue()就是取所在单元的值
System.out.println("左上端单元是: " + cell.getStringCellValue());
}catch(Exception e) {
System.out.println("已运行xlRead() : " + e );
}
}
}
设置单元格格式
在这里,我们将只介绍一些和格式设置有关的语句,我们假定workbook就是对一个工作簿的引用。在Java中,第一步要做的就是创建和设置 字体和单元格的格式,然后再应用这些格式:
1、创建字体,设置其为红色、粗体:
HSSFFont font = workbook.createFont();
font.setColor(HSSFFont.COLOR_RED);
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
2、创建格式
HSSFCellStyle cellStyle= workbook.createCellStyle();
cellStyle.setFont(font);
3、应用格式
HSSFCell cell = row.createCell((short) 0);
cell.setCellStyle(cellStyle);
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
cell.setCellValue("标题 ");
处理WORD文档
import java .io.*;
import org.apache.poi.hwpf.extractor.WordExtractor;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFCell;
public class TestPoi {
public TestPoi() {
}
public static void main(String args[]) throws Exception
{
FileInputStream in = new FileInputStream ("D:/a.doc");
WordExtractor extractor = new WordExtractor();
String str = extractor.extractText(in);
//System.out.println("the result length is"+str.length());
System.out.println(str);
}
}
搜集链接 方便以后查阅
POI操作Excel常用方法总结
自己封装的poi操作excel工具类