本文目录一览:

用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工具类