一、POI概述

  Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。

  结构:HSSF - 提供读写Microsoft Excel格式档案的功能。XSSF - 提供读写Microsoft Excel OOXML格式档案的功能。HWPF - 提供读写Microsoft Word格式档案的功能。HSLF - 提供读写Microsoft PowerPoint格式档案的功能。HDGF - 提供读写Microsoft Visio格式档案的功能。
HSSF 是Horrible SpreadSheet Format的缩写,通过HSSF,你可以用纯Java代码来读取、写入、修改Excel文件。HSSF 为读取操作提供了两类API:usermodel和eventusermodel,即“用户模型”和“事件-用户模型”。

POI EXCEL文档结构类

HSSFWorkbook excel文档对象 HSSFSheet excel的sheet HSSFRow excel的行 HSSFCell excel的单元格 HSSFFont excel字体 HSSFName 名称 HSSFDataFormat 日期格式 HSSFHeader sheet头 HSSFFooter sheet尾 HSSFCellStyle cell样式 HSSFDateUtil 日期 HSSFPrintSetup 打印 HSSFErrorConstants 错误信息表

poi读excel
public List<Area> importXLS(){ ArrayList<Area> list = new ArrayList<>();
try {
     //1、获取文件输入流
     InputStream inputStream = new FileInputStream("/Users/Shared/数据.xls");
     //2、获取Excel工作簿对象
HSSFWorkbook workbook = new HSSFWorkbook(inputStream);
     //3、得到Excel工作表对象
HSSFSheet sheetAt = workbook.getSheetAt(0);
//4、循环读取表格数据
     for (Row row : sheetAt) {
       //首行(即表头)不读取
if (row.getRowNum() == 0) {
continue;
}
//读取当前行中单元格数据,索引从0开始
       String areaNum = row.getCell(0).getStringCellValue();
String province = row.getCell(1).getStringCellValue();
String city = row.getCell(2).getStringCellValue();
String district = row.getCell(3).getStringCellValue();
String postcode = row.getCell(4).getStringCellValue(); Area area = new Area();
area.setCity(city);
area.setDistrict(district);
area.setProvince(province);
       area.setPostCode(postcode);
list.add(area);
}
     //5、关闭流
workbook.close();
} catch (IOException e) {
e.printStackTrace();
}
  return list;
}

poi读取excel

poi XSSFWorkbook读取.xlsx文件
// 打开指定位置的Excel文件
FileInputStream file = new FileInputStream(new File(fileLocation));
Workbook workbook = new XSSFWorkbook(file);
// 打开Excel中的第一个Sheet
Sheet sheet = workbook.getSheetAt(0); // 读取Sheet中的数据
Map<Integer, List<String>> data = new HashMap<>();
int i = 0;
for (Row row : sheet) { // 行
data.put(i, new ArrayList<String>());
for (Cell cell : row) { // 单元格
switch (cell.getCellType()) { // 不同的数据类型
case STRING: ... break; // 字符串类型
case NUMERIC: ... break; // 数值类型
case BOOLEAN: ... break; // 布尔类型
case FORMULA: ... break; // 公式类型
case BLANK: ... break; // 空白类型
}
}
i++;
}
//poi读excel
POIFSFileSystem fs=newPOIFSFileSystem(new FileInputStream("d:/test.xls"));
//得到Excel工作簿对象
HSSFWorkbook wb = new HSSFWorkbook(fs);
//得到Excel工作表对象
HSSFSheet sheet = wb.getSheetAt(0);
//得到Excel工作表的行
HSSFRow row = sheet.getRow(i);
//得到Excel工作表指定行的单元格
HSSFCell cell = row.getCell((short) j);
cellStyle = cell.getCellStyle();//得到单元格样式 //poi写excel
HSSFWorkbook wb = new HSSFWorkbook();//创建Excel工作簿对象
HSSFSheet sheet = wb.createSheet("new sheet");//创建Excel工作表对象
HSSFRow row = sheet.createRow((short)0); //创建Excel工作表的行
cellStyle = wb.createCellStyle();//创建单元格样式
row.createCell((short)0).setCellStyle(cellStyle); //创建Excel工作表指定行的单元格
row.createCell((short)0).setCellValue(1); //设置Excel工作表的值

poi

poi写excel
public void exportExcel() throws IOException { Page<Area> page = areaService.pageQuery(null);
List<Area> list = page.getContent(); //1.在内存中创建一个excel文件
HSSFWorkbook hssfWorkbook = new HSSFWorkbook();
//2.创建工作簿
HSSFSheet sheet = hssfWorkbook.createSheet();
//3.创建标题行
HSSFRow titlerRow = sheet.createRow(0);
titlerRow.createCell(0).setCellValue("标题1");
titlerRow.createCell(1).setCellValue("标题2");
titlerRow.createCell(2).setCellValue("标题3");
titlerRow.createCell(3).setCellValue("标题4");
titlerRow.createCell(4).setCellValue("标题5");
titlerRow.createCell(5).setCellValue("标题6"); //4.遍历数据,创建数据行
for (Area area : list) {
//获取最后一行的行号
int lastRowNum = sheet.getLastRowNum();
HSSFRow dataRow = sheet.createRow(lastRowNum + 1);
dataRow.createCell(0).setCellValue(area.getProvince());
dataRow.createCell(1).setCellValue(area.getCity());
dataRow.createCell(2).setCellValue(area.getDistrict());
dataRow.createCell(3).setCellValue(area.getPostcode());
dataRow.createCell(4).setCellValue(area.getShortcode());
dataRow.createCell(5).setCellValue(area.getCitycode());
}
//5.创建文件名
String fileName = "数据统计.xls";
//6.获取输出流对象
HttpServletResponse response = ServletActionContext.getResponse();
ServletOutputStream outputStream = response.getOutputStream(); //7.获取mimeType
ServletContext servletContext = ServletActionContext.getServletContext();
String mimeType = servletContext.getMimeType(fileName);
//8.获取浏览器信息,对文件名进行重新编码
HttpServletRequest request = ServletActionContext.getRequest();
fileName = FileUtils.filenameEncoding(fileName, request); //9.设置信息头
response.setContentType(mimeType);
response.setHeader("Content-Disposition","attachment;filename="+fileName);
//10.写出文件,关闭流
hssfWorkbook.write(outputStream);
hssfWorkbook.close();
}
public class FileUtils {   public static String filenameEncoding(String filename, HttpServletRequest request) throws IOException {
    String agent = request.getHeader("User-Agent"); //获取浏览器
    if (agent.contains("Firefox")) {
      BASE64Encoder base64Encoder = new BASE64Encoder();
      filename = "=?utf-8?B?"
      + base64Encoder.encode(filename.getBytes("utf-8"))
      + "?=";
      } else if(agent.contains("MSIE")) {
    filename = URLEncoder.encode(filename, "utf-8");
    } else if(agent.contains ("Safari")) {
    filename = new String (filename.getBytes ("utf-8"),"ISO8859-1");
    } else {
    filename = URLEncoder.encode(filename, "utf-8");
  }
  return filename;
  }
}

poi写入excel设置sheet名称和单元格内容wb.setSheetName(1, "第一张工作表",HSSFCell.ENCODING_UTF_16); cell.setEncoding((short) 1); cell.setCellValue("单元格内容");取得sheet的数目wb.getNumberOfSheets()


根据index取得sheet对象
HSSFSheet sheet = wb.getSheetAt(0); 取得有效的行数
int rowcount = sheet.getLastRowNum(); 取得一行的有效单元格个数
row.getLastCellNum(); 单元格值类型读写
cell.setCellType(HSSFCell.CELL_TYPE_STRING); //设置单元格为STRING类型
cell.getNumericCellValue();//读取为数值类型的单元格内容 设置列宽、行高
sheet.setColumnWidth((short)column,(short)width);
row.setHeight((short)height);
HSSFSheet有个方法叫SetColumnWidth,共有两个参数:一个是列的索引(从0开始),一个是宽度
HSSFWorkbook hssfworkbook = new HSSFWorkbook();
HSSFSheet sheet1 = hssfworkbook.CreateSheet(“Sheet1″);
sheet1.SetColumnWidth(1, 100 * 256);
读取一个列的宽度呢
int col1width = sheet1.GetColumnWidth(1);
要设置第一行的高度
sheet1.CreateRow(0).Height = 200*20;或sheet1.CreateRow(0).HeightInPoints = 200;
获得某一行的行高,可以直接拿HSSFRow.Height属性的返回值
使用HSSFSheet.DefaultColumnWidth、HSSFSheet.DefaultRowHeight和HSSFSheet.DefaultRowHeightInPoints属性。 
一旦设置了这些属性,如果某一行或者某一列没有设置宽度,就会使用默认宽度或高度
sheet1.DefaultColumnWidth=100*256;
sheet1.DefaultRowHeight=30*20; // 设置字体
HSSFFont font = workbook.createFont();
font.setFontHeightInPoints((short) 20); //字体高度
font.setColor(HSSFFont.COLOR_RED); //字体颜色
font.setFontName("黑体"); //字体
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); //宽度
font.setItalic(true); //是否使用斜体
//      font.setStrikeout(true); //是否使用划线 // 设置单元格类型
HSSFCellStyle cellStyle = workbook.createCellStyle();
cellStyle.setFont(font);
cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); //水平布局:居中
cellStyle.setWrapText(true); // 添加单元格注释
// 创建HSSFPatriarch对象,HSSFPatriarch是所有注释的容器.
HSSFPatriarch patr = sheet.createDrawingPatriarch();
// 定义注释的大小和位置,详见文档
HSSFComment comment = patr.createComment(new HSSFClientAnchor(0, 0, 0, 0, (short)4, 2, (short) 6, 5));
// 设置注释内容
comment.setString(new HSSFRichTextString("可以在POI中添加注释!"));
// 设置注释作者. 当鼠标移动到单元格上是可以在状态栏中看到该内容.
comment.setAuthor("Xuys."); // 创建单元格
HSSFCell cell = row.createCell((short) 1);
HSSFRichTextString hssfString = new HSSFRichTextString("Hello World!");
cell.setCellValue(hssfString);//设置单元格内容
cell.setCellStyle(cellStyle);//设置单元格样式
cell.setCellType(HSSFCell.CELL_TYPE_STRING);//指定单元格格式:数值、公式或字符串
cell.setCellComment(comment);//添加注释
添加区域,合并单元格
Region region = new Region((short)rowFrom,(short)columnFrom,(short)rowTo
(short)columnTo);//合并从第rowFrom行columnFrom列
sheet.addMergedRegion(region);// 到rowTo行columnTo的区域
//得到所有区域
sheet.getNumMergedRegions()
合并单元格及添加超链接
//合并单元格,合并参数依次为--->行开始位置,行结束位置,列开始位置,列结束位置
sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 5));
XSSFRow row = sheet.createRow(1);
XSSFCell cell = row.createCell(0);
//设置单元格函数,此处功能为添加超链接与其他sheet关联,如果需要其他功能请参考excel函数自行修改
cell.setCellFormula("HYPERLINK(\"#TestSheet2!A1\",\"TestSheet2\")");
保存Excel文件
FileOutputStream fileOut = new FileOutputStream(path);
wb.write(fileOut);
常用单元格边框格式
HSSFCellStyle style = wb.createCellStyle();
style.setBorderBottom(HSSFCellStyle.BORDER_DOTTED);//下边框
style.setBorderLeft(HSSFCellStyle.BORDER_DOTTED);//左边框
style.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框
style.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框 设置字体和内容位置
HSSFFont f = wb.createFont();
f.setFontHeightInPoints((short) 11);//字号
f.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);//加粗
style.setFont(f);
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//左右居中
style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//上下居中
style.setRotation(short rotation);//单元格内容的旋转的角度
HSSFDataFormat df = wb.createDataFormat();
style1.setDataFormat(df.getFormat("0.00%"));//设置单元格数据格式
cell.setCellFormula(string);//给单元格设公式
style.setRotation(short rotation);//单元格内容的旋转的角度 插入图片
//先把读进来的图片放到一个ByteArrayOutputStream中,以便产生ByteArray
ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
BufferedImage bufferImg = ImageIO.read(new File("ok.jpg"));
ImageIO.write(bufferImg,"jpg",byteArrayOut);
//读进一个excel模版
FileInputStream fos = new FileInputStream(filePathName+"/stencil.xlt");
fs = new POIFSFileSystem(fos);
//创建一个工作薄
HSSFWorkbook wb = new HSSFWorkbook(fs);
HSSFSheet sheet = wb.getSheetAt(0);
HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
HSSFClientAnchor anchor = new HSSFClientAnchor(0,0,1023,255,(short) 0,0,(short)10,10);
patriarch.createPicture(anchor , wb.addPicture(byteArrayOut.toByteArray(),HSSFWorkbook.PICTURE_TYPE_JPEG)); 调整工作表位置
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("format sheet");
HSSFPrintSetup ps = sheet.getPrintSetup();
sheet.setAutobreaks(true);
ps.setFitHeight((short)1);
ps.setFitWidth((short)1);
public String getCellStringValue(HSSFCell cell) {
  String cellValue = "";
  switch (cell.getCellType()) {
    case HSSFCell.CELL_TYPE_STRING://字符串类型
        cellValue = cell.getStringCellValue();
        if(cellValue.trim().equals("")||cellValue.trim().length()<=0)
          cellValue=" ";
        break;
    case HSSFCell.CELL_TYPE_NUMERIC: //数值类型
        cellValue = String.valueOf(cell.getNumericCellValue());
        break;
    case HSSFCell.CELL_TYPE_FORMULA: //公式
        cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
        cellValue = String.valueOf(cell.getNumericCellValue());
        break;
    case HSSFCell.CELL_TYPE_BLANK:
        cellValue=" ";
        break;
    case HSSFCell.CELL_TYPE_BOOLEAN:
        break;
    case HSSFCell.CELL_TYPE_ERROR:
        break;
    default:
        break;
  }
  return cellValue;
}

根据单元格不同属性返回字符串数值

POI打印Excel的更多相关文章

  1. POI打印Excel报表

    1.将POI组件中的jar包放入项目中路径下的WEB-INF/lib目录中 2.在javabean中创建一个poi的java文件,中间出了创建getXXX(),setXXX()方法外,加入readRe ...

  2. 11、借助POI实现Java生成并打印excel报表(2)

    11.POI打印功能 11.1.常用模块形式: HSSFPrintSetup printSetup = sheet.getPrintSetup(); printSetup.setVResolution ...

  3. 使用poi将excel转换为html,适用本身有导出excel的而现在需要添加网页打印的功能

    PoiExcelToHtmlUtil.java import org.apache.poi.POIXMLDocumentPart; import org.apache.poi.hssf.usermod ...

  4. APACHE POI教程 --java应用程序用POI与Excel交互

    POI报表 --用POI与Excel交互 AURISOFT 第一章 POI简介 --Jakata Poi HSSF:纯java的Excel解决方案 在我们实际的开发中,表现层的解决方案虽然有多样,但是 ...

  5. POI导出EXCEL经典实现

    1.Apache POI简介 Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程式对Microsoft Office格式档案读和写的功能. .NET的开发人员则 ...

  6. 自己封装的poi操作Excel工具类

    自己封装的poi操作Excel工具类 在上一篇文章<使用poi读写Excel>中分享了一下poi操作Excel的简单示例,这次要分享一下我封装的一个Excel操作的工具类. 该工具类主要完 ...

  7. Java POI 导出EXCEL经典实现 Java导出Excel

    转自http://blog.csdn.net/evangel_z/article/details/7332535 在web开发中,有一个经典的功能,就是数据的导入导出.特别是数据的导出,在生产管理或者 ...

  8. 自己的包poi操作Excel工具

    在前面的文章<使用poi读写Excel>中分享了一下poi操作Excel的简单演示样例.这次要分享一下我封装的一个Excel操作的工具类. 该工具类主要完毕的功能是:读取Excel.汇总E ...

  9. Java使用POI为Excel打水印,调整列宽并设置Excel只读(用户不可编辑)

    本文介绍在Java语言环境下,使用POI为Excel打水印的解决方案,具体的代码编写以及相关的注意事项. 需求描述: 要求通过系统下载的Excel都带上公司的水印,列宽调整为合适的宽度,并且设置为不可 ...

随机推荐

  1. Serverless 的喧哗与骚动(一)附Serverless行业发展回顾

    作者 | 阿里中间件高级技术专家 许晓斌 <Maven实战>作者,曾负责 AliExpress 微服务架构演进,现在负责阿里集团 Serverless 技术研发落地. 导读:从 2016 ...

  2. dedecms5.7文章页的标签随机插入到内容中并且标签的地址为其标签关联的其他文章地址

    dedecms5.7文章页的标签随机插入到内容中并且标签的地址为其他标签关联的文章地址 1 添加2个自定义函数 在dede/include/extend.func.php底部 添加如下代码 //根据文 ...

  3. yield return,yield break

    转自, http://www.cnblogs.com/kingcat/archive/2012/07/11/2585943.html yield return 表示在迭代中下一个迭代时返回的数据,除此 ...

  4. MVC 创建Controllers 发生 EntityType has no key defined error

    发生如图错误 只需要在对应的类中指定Key即可 添加引用 : System.ComponentModel.DataAnnotations 参考:https://stackoverflow.com/qu ...

  5. 纯C语言实现循环双向链表创建,插入和删除

    #include <stdio.h> #include <stdlib.h> typedef int ElemType; typedef struct DLNode{ Elem ...

  6. php CI如何实现全站静态生成html,动态创建目录

    php CI如何实现全站静态生成html,动态创建目录CodeIgniter框架生成HTML的方法 public function out_html($code) { $data['articles' ...

  7. iconfont采坑

    1. iconfont采坑 1.1. 前言 使用iconfont过程中踩过坑特此记录 不知道iconfont的这里也简单介绍一笔,阿里开放的一个图标素材库,用来快速找图标下载使用图标 iconfont ...

  8. OPC 集成的五大要素,你都掌握了吗?

    相信在处理工业项目集成问题的时候,自动化集成供应商真正需要的不是那些华丽的宣传语,而是提供真正的通信数据集成实力. 任何自动化集成的供应商都希望能够消除中间的层层障碍,从而实现真正的信息集成互通.那么 ...

  9. ios视频网盘

    http://pan.baidu.com/share/home?uk=1711799154#category/type=0

  10. 数据挖掘--K-means

    K-Means方法是MacQueen1967年提出的.给定一个数据集合X和一个整数K(n),K-Means方法是将X分成K个聚类并使得在每个聚类中所有值与该聚类中心距离的总和最小. K-Means聚 ...