文档章节

POI创建EXCEL文档

MLeo
 MLeo
发布于 2013/11/19 16:57
字数 1537
阅读 126
收藏 6
点赞 0
评论 0
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.DataFormat;
import org.apache.poi.ss.usermodel.Font;
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.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.util.WorkbookUtil;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.pinganfu.common.log.LOG_TYPE;
import com.pinganfu.newcard.gm.util.servlet.InitSystemServlet;
import com.pinganfu.newcard.gm.web.report.model.CellColumn;
import com.pinganfu.newcard.gm.web.report.model.ExcelColumn;
import com.pinganfu.newcard.gm.web.report.model.ExcelTitle;
import com.thoughtworks.xstream.XStream;
/**
 * 
 * 
 * @author MLeo
 * @version $Id: ExcelPOI.java, v 0.1 2014年8月11日 下午4:56:32 MLeo Exp $
 */
public class ExcelPOI {
    
    private  Workbook wb;
    private   ExcelTitle title;
    private  List<ExcelColumn> columns;
    private  List<CellStyle> contentStyles;
    private  Logger  LOG = LoggerFactory.getLogger(LOG_TYPE.PAFF_SERVICE.val);

    public  void loadXml(String xml) throws FileNotFoundException{
      xml = InitSystemServlet.rootPath+"WEB-INF"+File.separator+ "reportexcelxml" +File.separator+xml;
//      xml = InitSystemServlet.rootPath+File.separator+"WEB-INF"+File.separator+ "reportexcelxml" +File.separator+xml;
      LOG.info("xml:"+xml);
      XStream stream = new XStream();
      stream.alias("title", ExcelTitle.class);
      stream.alias("column", ExcelColumn.class);
      stream.alias("cell", CellColumn.class);
      
      title = (ExcelTitle)stream.fromXML(new FileInputStream(xml));
      columns = title.getColumns();
    }
    
    
    public  void loadExcel(String xml) throws FileNotFoundException{
        LOG.info("POIExcel:Lood");
        loadXml(xml);//加载XML文档
        wb  =  createWorkbook();//创建Workbook
        //添加sheet标签
        Sheet sheet = createSheet(wb, title.getTitleName());//创建标签
        //创建sheet样式
        CellStyle sheetStyle = wb.createCellStyle();
        sheetStyle(wb, sheetStyle,title);
        //添加sheet标题
        Row sheetRow = createRow(sheet, 1);//创建行
        for (int i = 0; i < columns.size(); i++) {
            Cell sheetCell = createCell(sheetRow, i+1);//创建单元格
            addStyle(sheetCell, sheetStyle);//添加样式
            if(0 == i){
                addValue(sheetCell, title.getTitleName());//添加单元格内容
            }
        }
        mergeCells(sheet, 1, 1, 1, columns.size());//合并表格
        
        //添加title标题
        Row titleRow = createRow(sheet, 2);//创建行
        for (int i = 0; i < columns.size(); i++) {
            ExcelColumn column = columns.get(i);
            Cell  titleCell = createCell(titleRow, i+1);//创建单元格
            CellStyle titleStyle = wb.createCellStyle();
            titleStyle(wb, titleStyle,column);
            addStyle(titleCell, titleStyle);//添加样式
            addValue(titleCell, column.getColumnName());//添加单元格内容
            columnWidth(sheet, i+1, column.getWidth()); //设置列宽
        }
        
        //创建cell样式
        contentStyles = new ArrayList<CellStyle>();
        for (ExcelColumn column : columns) {
            CellStyle contentStyle = wb.createCellStyle();
            contentStyle(wb,  contentStyle, column.getCell());
            contentStyles.add(contentStyle);
        }
        LOG.info("POIExcel:LoodEnd");
    }
    
    
    public   Workbook createExcel(List<?> list) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, FileNotFoundException {
            LOG.info("POIExcel:CreateExcelRow");
            //添加内容信息
            Sheet sheet = wb.getSheetAt(0);//获取当前的标签对象
            int rowNum = wb.getSheetAt(0).getLastRowNum();
            list = list == null ? new ArrayList<Object>():list;
            for (Object obj : list) {
                Row contentRow = createRow(sheet, ++rowNum);//创建行
                Class<?> clazz = obj.getClass();
                for (int i = 0; i < columns.size(); i++) {
                    ExcelColumn column = columns.get(i);
                    CellColumn cell = column.getCell();
                    Cell  contentCell = createCell(contentRow, i+1);//创建单元格
                    addStyle(contentCell, contentStyles.get(i));//添加样式
                    Field field = clazz.getDeclaredField(column.getField());
                    field.setAccessible(true);
                    Object fieldValue = field.get(obj);
                    addValue(contentCell, fieldValue,cell.getPrecision());//添加单元格内容
                }
        }
            LOG.info("POIExcel:CreateExcelRowEnd");
        return wb;
    }
    
    /**
     * 单元格赋值
     * @param cell 
     * @param value 
     */
    public  void addValue(Cell cell,Object value,Integer precision) {
        if(null == value){
            return;
        }else if (value instanceof String) {
            cell.setCellValue((String) value);
        } else if (value instanceof Date) {
            cell.setCellValue((Date) value);
        } else if (value instanceof Number) {
            if(null != precision && 0 != precision){
                cell.setCellValue(((Number) value).doubleValue()/precision);
            }else{
                cell.setCellValue(((Number) value).doubleValue());
            }
        } else if (value instanceof Boolean) {
            cell.setCellValue(((Boolean) value).booleanValue());
        } else {
            cell.setCellValue(value.toString());
        }
    }
    
    

    /**
     * 写入工作簿
     * 
     * @param wb
     * @param path
     */
    public  void writeWorkbook(Workbook wb, String pathBookName) {
        FileOutputStream fileOut = null;
        try {
            fileOut = new FileOutputStream(pathBookName);
            wb.write(fileOut);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                fileOut.close();
                fileOut.flush();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        
    }
    
    public  CellStyle  sheetStyle(Workbook wb,CellStyle style,ExcelTitle title){
        Font font = wb.createFont();
        if(title.getFontBlod()){
            font.setBoldweight(Font.BOLDWEIGHT_BOLD);// 粗体
        }else{
            font.setBoldweight(Font.BOLDWEIGHT_NORMAL);// 粗体
        }
        if(0 != title.getFontSize()){
            font.setFontHeightInPoints(title.getFontSize());// 字体大小
        }else{
            font.setFontHeightInPoints((short)12);// 字体大小
        }
        if(null != title.getFontName() && !"".equals(title.getFontName())){
            font.setFontName(title.getFontName());// 字体名字
        }
        if("center".equals(title.getAlign())){
            style.setAlignment(CellStyle.ALIGN_CENTER);
        }else if("left".equals(title.getAlign())){
            style.setAlignment(CellStyle.ALIGN_LEFT);
        }else if("right".equals(title.getAlign())){
            style.setAlignment(CellStyle.ALIGN_RIGHT);
        }
        if("center".equals(title.getVertical())){
            style.setAlignment(CellStyle.VERTICAL_CENTER);
        }else if("top".equals(title.getVertical())){
            style.setAlignment(CellStyle.VERTICAL_TOP);
        }else if("bottom".equals(title.getVertical())){
            style.setAlignment(CellStyle.VERTICAL_BOTTOM);
        }
        if(title.getBorder()){
            styleFrame(style);//设置边框  
        }
        style.setFont(font);
        return style;
    }
    
    public  CellStyle  titleStyle(Workbook wb,CellStyle style,ExcelColumn column){
        Font font = wb.createFont();
        if(column.getFontBlod()){
            font.setBoldweight(Font.BOLDWEIGHT_BOLD);// 粗体
        }else{
            font.setBoldweight(Font.BOLDWEIGHT_NORMAL);// 粗体
        }
        if(0 != column.getFontSize()){
            font.setFontHeightInPoints(column.getFontSize());// 字体大小
        }else{
            font.setFontHeightInPoints((short)12);// 字体大小
        }
        if(null != column.getFontName() && !"".equals(column.getFontName())){
            font.setFontName(column.getFontName());// 字体名字
        }
        if("center".equals(column.getAlign())){
            style.setAlignment(CellStyle.ALIGN_CENTER);
        }else if("left".equals(column.getAlign())){
            style.setAlignment(CellStyle.ALIGN_LEFT);
        }else if("right".equals(column.getAlign())){
            style.setAlignment(CellStyle.ALIGN_RIGHT);
        }
        if("center".equals(column.getVertical())){
            style.setAlignment(CellStyle.VERTICAL_CENTER);
        }else if("top".equals(column.getVertical())){
            style.setAlignment(CellStyle.VERTICAL_TOP);
        }else if("bottom".equals(column.getVertical())){
            style.setAlignment(CellStyle.VERTICAL_BOTTOM);
        }
        if(column.getBorder()){
            styleFrame(style);//设置边框  
        }
        style.setFont(font);
        return style;
    }
    
    public  CellStyle  contentStyle(Workbook wb,CellStyle style,CellColumn cell){
        Font font = wb.createFont();
        if(cell.getFontBlod()){
            font.setBoldweight(Font.BOLDWEIGHT_BOLD);// 粗体
        }else{
            font.setBoldweight(Font.BOLDWEIGHT_NORMAL);// 粗体
        }
        if(0 != cell.getFontSize()){
            font.setFontHeightInPoints(cell.getFontSize());// 字体大小
        }else{
            font.setFontHeightInPoints((short)12);// 字体大小
        }
        if(null != cell.getFontName() && !"".equals(cell.getFontName())){
            font.setFontName(cell.getFontName());// 字体名字
        }
        if("center".equals(cell.getAlign())){
            style.setAlignment(CellStyle.ALIGN_CENTER);
        }else if("left".equals(cell.getAlign())){
            style.setAlignment(CellStyle.ALIGN_LEFT);
        }else if("right".equals(cell.getAlign())){
            style.setAlignment(CellStyle.ALIGN_RIGHT);
        }
        if("center".equals(cell.getVertical())){
            style.setAlignment(CellStyle.VERTICAL_CENTER);
        }else if("top".equals(cell.getVertical())){
            style.setAlignment(CellStyle.VERTICAL_TOP);
        }else if("bottom".equals(cell.getVertical())){
            style.setAlignment(CellStyle.VERTICAL_BOTTOM);
        }
        if(null != cell.getFormat() && !"".equals(cell.getFormat())){
            DataFormat format = wb.createDataFormat();
            style.setDataFormat(format.getFormat(cell.getFormat()));
        }
        if(cell.getBorder()){
            styleFrame(style);//设置边框  
        }
        style.setFont(font);
        return style;
    }
 
    /**
     * 创建工作簿
     * 
     * @return Workbook
     */
    public  Workbook createWorkbook() {
        Workbook wb = new XSSFWorkbook();
        return wb;
    }
 
    /**
     * 创建工作表
     * 
     * @param sheetNames
     * @param wb
     */
    public  Sheet createSheet(Workbook wb, String sheetName) {
        String safeName = WorkbookUtil.createSafeSheetName(sheetName); // 一个安全的方式来创建有效的名称,这个工具替换无效字符用空格('')
        Sheet sheet = wb.createSheet(safeName);
        return sheet;
    }
    /**
     * 创建工作表
     * 
     * @param sheetNames
     * @param wb
     */
    public  List<Sheet> createSheets(Workbook wb, List<String> sheetNames) {
        List<Sheet> sheets = new ArrayList<Sheet>();
        for (String sheetName : sheetNames) {
            // 一个安全的方式来创建有效的名称,这个工具替换无效字符用空格('')
            String safeName = WorkbookUtil.createSafeSheetName(sheetName);
            Sheet sheet = wb.createSheet(safeName);
            sheets.add(sheet);
        }
        return sheets;
    }
 
    /**
     * 创建行
     * 
     * @param sheet
     * @param rowIndex
     * @return
     */
    public  Row createRow(Sheet sheet, int rowIndex) {
        Row row = sheet.createRow(rowIndex);
        return row;
    }
 
    /**
     * 创建单元格
     * 
     * @param row
     * @param cellIndex
     * @return Cell
     */
    public  Cell createCell(Row row, int cellIndex) {
        Cell cell = row.createCell(cellIndex);
        return cell;
    }
 
    /**
     * 单元格赋值
     * 
     * @param cell
     * @param cellValue Double
     * @return Cell
     */
    public  Cell addValue(Cell cell, Double cellValue) {
        cell.setCellValue(cellValue);
        return cell;
    }
    /**
     * 单元格赋值
     * 
     * @param cell
     * @param cellValue Date
     * @return Cell
     */
    public  Cell addValue(Cell cell, Date cellValue) {
        cell.setCellValue(cellValue);
        return cell;
    }
    /**
     * 单元格赋值
     * 
     * @param cell
     * @param cellValue Boolean
     * @return Cell
     */
    public  Cell addValue(Cell cell, Boolean cellValue) {
        cell.setCellValue(cellValue);
        return cell;
    }
    /**
     * 单元格赋值
     * 
     * @param cell
     * @param cellValue String
     * @return Cell
     */
    public  Cell addValue(Cell cell,String cellValue) {
        cell.setCellValue(cellValue);
        return cell;
    }
 
    /**
     * 添加样试
     * 
     * @param cell
     * @param style
     * @return
     */
    public  Cell addStyle(Cell cell, CellStyle style) {
        cell.setCellStyle(style);
        return cell;
    }
 
    /**
     * 设置字体颜色
     * 
     * @param wb
     * @param style
     * @param fontBlod 字体粗细
     * @param fontColor 字体颜色
     * @param fontHeight 字体大小
     * @param fontName 字体名字
     * @return
     */
    public  CellStyle styleFont(Workbook wb, CellStyle style, short fontBlod, short fontColor, short fontHeight, String fontName) {
        Font font = wb.createFont();
        font.setBoldweight(fontBlod);// 粗体
        font.setColor(fontColor);// 字体颜色
        font.setFontHeightInPoints(fontHeight);// 字体大小
        font.setFontName(fontName);// 字体名字
        style.setFont(font);
        return style;
    }
    
    /**
     * 设置字体颜色
     * 
     * @param wb
     * @param style
     * @param fontBlod 字体粗细
     * @param fontColor 字体颜色
     * @param fontHeight 字体大小
     * @return
     */
    public  CellStyle styleFont(Workbook wb, CellStyle style, short fontBlod, short fontColor, short fontHeight) {
        Font font = wb.createFont();
        font.setBoldweight(fontBlod);// 粗体
        font.setColor(fontColor);// 字体颜色
        font.setFontHeightInPoints(fontHeight);// 字体大小
        style.setFont(font);
        return style;
    }
 
    /**
     * 设置背景色
     * 
     * @param style
     * @param foregroundCorlor
     * @return CellStyle
     */
    public  CellStyle styleForegroundColor(CellStyle style,short foregroundCorlor) {
        style.setFillForegroundColor(foregroundCorlor);
        style.setFillPattern(CellStyle.SOLID_FOREGROUND);
        return style;
    }
    /**
     * 设置格式
     * 
     * @param wb
     * @param style
     * @param dataFormat 格式
     * @return CellStyle
     */
    public  CellStyle styleDataFormat(Workbook wb,CellStyle style,String dataFormat) {
        DataFormat format = wb.createDataFormat();
        style.setDataFormat(format.getFormat(dataFormat));
        return style;
    }
 
    /**
     * 对齐方式
     * 
     * @param style
     * @param halign
     * @param valign
     * @return CellStyle
     */
    public  CellStyle styleAlignment(CellStyle style, short halign,short valign) {
        style.setAlignment(halign);
        style.setVerticalAlignment(valign);
        return style;
    }
     
    /**
     * 单元格边框
     * @param style
     * @return CellStyle
     */
    public  CellStyle styleFrame(CellStyle style) {
        style.setBorderBottom(CellStyle.BORDER_THIN);
        style.setBottomBorderColor(IndexedColors.BLACK.getIndex());
        style.setBorderLeft(CellStyle.BORDER_THIN);
        style.setLeftBorderColor(IndexedColors.BLACK.getIndex());
        style.setBorderRight(CellStyle.BORDER_THIN);
        style.setRightBorderColor(IndexedColors.BLACK.getIndex());
        style.setBorderTop(CellStyle.BORDER_THIN);
        style.setTopBorderColor(IndexedColors.BLACK.getIndex());
        return style;
    }
     
     
    /**
     * 合并单元格
     * @param sheet
     * @param firstRow 开始行
     * @param lastRow 最后行
     * @param firstColumn 开始列
     * @param lastColumn 最后列
     */
    public  void mergeCells(Sheet sheet,int firstRow,int lastRow,int firstColumn,int lastColumn) {
        sheet.addMergedRegion(new CellRangeAddress(firstRow, lastRow, firstColumn, lastColumn));
    }
 
    /**
     * 设置列宽度
     * @param sheet
     * @param columnIndex 列数
     * @param columnWidth 列宽
     */
    public  void columnWidth(Sheet sheet,Integer columnIndex,Integer columnWidth) {
        if(null != columnWidth && 0 != columnWidth){
            sheet.setColumnWidth(columnIndex, columnWidth);
        }else{
            sheet.setColumnWidth(columnIndex, 500*columnWidth+1000);
        }

    }

}


© 著作权归作者所有

共有 人打赏支持
MLeo
粉丝 9
博文 46
码字总数 6067
作品 0
普陀
程序员
使用 Apache POI 和 OpenOffice API 在 Linux 中统计 Office 文档的页数

简介: 在实际的项目开发中经常会遇到需要在不同的操作系统平台上统计 Microsoft Office 系列文档页数的要求。Apache POI 提供了一套完整的用于访问微软格式文档的 Java API。但是 Apache P...

IBMdW
2012/10/26
1K
0
在云端-看世间变幻/fluentexcel

##fluentexcel 简介 fluentexcel基于POI,旨在改进 excel 生成时的编码体验, 借鉴 fluent api 思想开发方便易用,同时书写方便的 excel 的 api。 更重要的是 fluentexcel 可以将一个 excel 20...

在云端-看世间变幻
2015/02/18
0
0
Java程序员从笨鸟到菜鸟之(一百零四)java操作office和pdf文件(二)利用POI实现数据导出excel报表

在上一篇博客中,我们简单介绍了java读取word,excel和pdf文档内容 ,但在实际开发中,我们用到最多的是把数据库中数据导出excel报表形式。不仅仅简单的读取office中的数据.尤其是在生产管理...

长平狐
2012/11/12
1K
0
java读写excel之POI篇—001

POI 简单介绍 Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。 Apache POI 是创建和维护操作各种符合Office Open XML(OOXML...

Mysoft
2015/09/21
56
0
POI操作Microsoft Office(Word、Excel、PowerPoint)全面了解

POI 与 Microsoft Office 1. POI 简介 POI 是 Apache 下的 Jakata 项目的一个子项目,主要用于提供 java 操作 Microsoft Office 办公套件如 Excel,Word,Powerpoint 等文件的 API. 微软的O...

sundy_ly
2014/01/13
0
1
使用 Apache POI 处理 Microsoft Office 文档

原文同步至:http://www.waylau.com/apache-poi-handle-microsoft-documents/ POI 概述 Apache POI 项目的使命是创造和维护 Java API 操纵各种格式的文件,其中包括基于 Office Open XML 标准...

waylau
2015/02/01
0
0
纯.NET实现的Office文件读写组件--NPOI

NPOI 是 POI 项目的 .NET 版本。POI是一个开源的Java读写Excel、WORD等微软OLE2组件文档的项目。 使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 WORD/EXCEL 文档进行读写。 ...

Neuzilla
2009/01/22
74.1K
7
关于HSSF与XSSF的问题

在用poi 创建excel文档时,HSSF创建的EXCEL文档导出之后 可以用autovue electro打开(.XLS和.XLSX都可以),但是用XSSF创建EXCEL文档导出,用 autovue electro就打不开了,还有就是 用XSSF创...

麦小兜
2014/04/25
197
0
JAVA用POI读取和创建2003和2007版本Excel完美示例

import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.text.DecimalF......

java牛
2015/10/26
0
0
关于POI操作OFFICE及PDF

在平常应用程序中,对office和pdf文档进行读取数据是比较常见的功能,尤其在很多web应用程序中。所以今天我们就简单来看一下java对word、excel、pdf文件的读取。我列出了一些关于操作OFFICE的...

manlianman
2014/04/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Android 复制和粘贴功能

做了一回搬运工,原文地址:https://blog.csdn.net/kennethyo/article/details/76602765 Android 复制和粘贴功能,需要调用系统服务ClipboardManager来实现。 ClipboardManager mClipboardM...

她叫我小渝
25分钟前
0
0
拦截SQLSERVER的SSL加密通道替换传输过程中的用户名密码实现运维审计(一)

工作准备 •一台SQLSERVER 2005/SQLSERVER 2008服务 •SQLSERVER jdbc驱动程序 •Java开发环境eclipse + jdk1.8 •java反编译工具JD-Core 反编译JDBC分析SQLSERVER客户端与服务器通信原理 SQ...

紅顏為君笑
42分钟前
4
0
jQuery零基础入门——(六)修改DOM结构

《jQuery零基础入门》系列博文是在廖雪峰老师的博文基础上,可能补充了个人的理解和日常遇到的点,用我的理解表述出来,主干出处来自廖雪峰老师的技术分享。 在《零基础入门JavaScript》的时...

JandenMa
59分钟前
0
0
linux mint 1.9 qq 安装

转: https://www.jianshu.com/p/cdc3d03c144d 1. 下载 qq 轻聊版,可在百度搜索后下载 QQ7.9Light.exe 2. 去wine的官网(https://wiki.winehq.org/Ubuntu) 安装 wine . 提醒网页可以切换成中...

Canaan_
今天
0
0
PHP后台运行命令并管理运行程序

php后台运行命令并管理后台运行程序 class ProcessModel{ private $pid; private $command; private $resultToFile = ''; public function __construct($cl=false){......

colin_86
今天
1
0
数据结构与算法4

在此程序中,HighArray类中的find()方法用数据项的值作为参数传递,它的返回值决定是否找到此数据项。 insert()方法向数组下一个空位置放置一个新的数据项。一个名为nElems的字段跟踪记录着...

沉迷于编程的小菜菜
今天
1
1
fiddler安装和基本使用以及代理设置

项目需求 由于开发过程中客户端和服务器数据交互非常频繁,有时候服务端需要知道客户端调用接口传了哪些参数过来,这个时候就需要一个工具可以监听这些接口请求参数,已经接口的响应的数据,这种...

银装素裹
今天
0
0
Python分析《我不是药神》豆瓣评论

读取 Mongo 中的短评数据,进行中文分词 对分词结果取 Top50 生成词云 生成词云效果 看来网上关于 我不是药神 vs 达拉斯 的争论很热啊。关于词频统计就这些,代码中也会完成一些其它的分析任...

猫咪编程
今天
0
0
虚拟机怎么安装vmware tools

https://blog.csdn.net/tjcwt2011/article/details/72638977

AndyZhouX
昨天
1
0
There is no session with id[xxx]

参考网页 https://blog.csdn.net/caimengyuan/article/details/52526765 报错 2018-07-19 23:04:35,330 [http-nio-1008-exec-8] DEBUG [org.apache.shiro.web.servlet.SimpleCookie] - Found......

karma123
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部