ylg娱乐官网java操作office和pdf文件java读取word,excel和pdf文书档案内容

POI读取单元格信息及单元格公式,poi读取单元格公式

Java操作EXCEL的利器一般都是POI和JXL,鄙人只是POI的忠实粉丝。(其实我是没有用过JXL)。

现在大多数的excel都是07以上的版本,所以我一般是用07的基础上使用POI。

单元格有样式和值,以及值得类型。

样式复制封装成一个函数:

public XSSFCellStyle cloneAllCellStyle(XSSFCell sourceCell, XSSFWorkbook targetWb){

        //创建一个样式
        XSSFCellStyle tempStyle = targetWb.createCellStyle(); //样式
        //数值格式,创建字符及数字格式
        DataFormat format= targetWb.createDataFormat();
        //字体
        XSSFFont font= targetWb.createFont();
        try{
            tempStyle.setDataFormat(format.getFormat( sourceCell.getCellStyle().getDataFormatString()));
        }catch(NullPointerException e){
            tempStyle.setDataFormat((short)0);
        }
        font.setColor(sourceCell.getCellStyle().getFont().getXSSFColor());
        font.setBold(sourceCell.getCellStyle().getFont().getBold());
        font.setBoldweight(sourceCell.getCellStyle().getFont().getBoldweight());
        try{
            font.setCharSet(sourceCell.getCellStyle().getFont().getCharSet());
        }catch(POIXMLException e){
            font.setCharSet(0);
        }
        //        font.setCharSet(sourceCell.getCellStyle().getFont().getCharSet());

        font.setFamily(sourceCell.getCellStyle().getFont().getFamily());
        font.setFontHeight(sourceCell.getCellStyle().getFont().getFontHeight());
        font.setFontHeightInPoints(sourceCell.getCellStyle().getFont().getFontHeightInPoints());
        font.setFontName(sourceCell.getCellStyle().getFont().getFontName());
        font.setItalic(sourceCell.getCellStyle().getFont().getItalic());
        font.setStrikeout(sourceCell.getCellStyle().getFont().getStrikeout());
        //        font.setThemeColor(sourceCell.getCellStyle().getFont().getThemeColor());
        font.setTypeOffset(sourceCell.getCellStyle().getFont().getTypeOffset());
        font.setUnderline(sourceCell.getCellStyle().getFont().getUnderline());

        tempStyle.setAlignment( sourceCell.getCellStyle().getAlignment());
        tempStyle.setVerticalAlignment(sourceCell.getCellStyle().getVerticalAlignment());
        tempStyle.setBorderBottom(sourceCell.getCellStyle().getBorderBottom());
        tempStyle.setBorderLeft(sourceCell.getCellStyle().getBorderLeft());
        tempStyle.setBorderRight(sourceCell.getCellStyle().getBorderRight());
        tempStyle.setBorderTop(sourceCell.getCellStyle().getBorderTop());
        tempStyle.setBottomBorderColor(sourceCell.getCellStyle().getBottomBorderXSSFColor());
        tempStyle.setLeftBorderColor(sourceCell.getCellStyle().getLeftBorderXSSFColor());
        tempStyle.setRightBorderColor(sourceCell.getCellStyle().getRightBorderXSSFColor());
        tempStyle.setTopBorderColor(sourceCell.getCellStyle().getTopBorderXSSFColor());
        tempStyle.setFillBackgroundColor(sourceCell.getCellStyle().getFillBackgroundColorColor());
        tempStyle.setFont(font);
        try{
            tempStyle.setFillForegroundColor(sourceCell.getCellStyle().getFillForegroundColorColor());
        }catch(NullPointerException e){
            tempStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());
        }
        tempStyle.setFillPattern(sourceCell.getCellStyle().getFillPattern());
        tempStyle.setRotation(sourceCell.getCellStyle().getRotation());
        tempStyle.setHidden(sourceCell.getCellStyle().getHidden());
        tempStyle.setWrapText(sourceCell.getCellStyle().getWrapText());
        tempStyle.setIndention(sourceCell.getCellStyle().getIndention());
        tempStyle.setLocked(sourceCell.getCellStyle().getLocked());

        return tempStyle;

    }

调用直接获取单元格的样式内容。

获取单元格值的类型:cell.getCellType()

根据值类型不同获取不同的值:

    switch (cell.getCellType()) {
                        case Cell.CELL_TYPE_BLANK:
                            tempValue.add("");
                            break;
                        case Cell.CELL_TYPE_BOOLEAN:
                            tempValue.add(cell.getBooleanCellValue());
                            break;
                        case Cell.CELL_TYPE_ERROR:
                            tempValue.add(cell.getErrorCellString());
                            break;
                        case Cell.CELL_TYPE_FORMULA:
                            tempValue.add(cell.getCellFormula());
                            map.put("formulaFlag", true);
                            break;
                        case Cell.CELL_TYPE_NUMERIC:
                            tempValue.add(cell.getNumericCellValue());
                            break;
                        case Cell.CELL_TYPE_STRING:
                            tempValue.add(cell.getStringCellValue());
                            break;
                        default:
                            break;
                        }

创建内容

//工作空间
        XSSFWorkbook targetWb = new XSSFWorkbook();        
     //sheet
        XSSFSheet targetSheet = targetWb.createSheet("行汇总");
     //       删除sheet
           targetWb.removeSheetAt(index);  //index表示第几个sheet,从0开始计数
          //row
XSSFRow row=targetSheet.createRow(i+num1-startRow+1); 
 //cell
      XSSFCell  cell=row.createCell(j);    //j 行

二、 操作单元格函数

POI能够读取函数,然后再把函数写入到单元格中,excel自己计算函数。而函数操作单元格的位置,一般是固定的,所以操作的单元格无法改变。

1、读取函数和写入函数

cell.getCellFormula()

 

       上面的代码中,获取函数的内容,类型为string。

       写入函数:

        

cell.setCellFormula((String)cellValues.get(j));

 

 

2、获取函数计算之后的值:

  有的地方直接写:

   cell.getNumberValue();这样有时候会报错,当cell的内容不是值得时候。

  最后做一个异常抛出。

当然有时候也读不出值,读出的值是0.0(double)

  读取函数值得另一种方法:

  XSSFFormulaEvaluator evaluator=new XSSFFormulaEvaluator(targetWb);

                                CellValue tempCellValue = evaluator.evaluate(cell); 



                                double cellValue1 =

tempCellValue.getNumberValue(); 

 

       

       

    
如何你是获取excel的值之后,再写入另一个单元格,建议写入值之前,先改变单元的值类型,变成数值型:

    

   cell.set(XSSFCell.CELL_TYPE_NUMERIC);

 

Java操作EXCEL的利器一般都是POI和JXL,鄙人只是POI的忠实粉丝。(其实我是没有用过JX…

在平常应用程序中,对office和pdf文档进行读取数据是比较常见的功能,尤其在很多web应用程序中。所以今天我们就简单来看一下Java对word、excel、pdf文件的读取。本篇博客只是讲解简单应用。如果想深入了解原理。请读者自行研究一些相关源码。

1.POI主要功能

可以操作office文档的Java API

主要功能:操作excel文档

​ 虽然也可以操作word文档,但功能比较差。Java中并没有优秀的word解析技术。

​ 解析word建议使用.net技术。Java利用WebService技术获取解析结果。

​ 为何要用专业组件来解析Excel?

​ 因为Excel不是一个单纯的文本格式。

与其他excel解析技术的比较:

​ JXL:只能操作excel2003(现在也能操作2007-2016了)

​ POI:可以操作整个office(excel,doc,vb宏,ppt,visio)

POI操作Excel,poiexcel

一、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格式档案的功能。

  使用必须引入依赖

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.17</version>
</dependency>

  注:3.17版本是支持jdk6的最后版本

二、HSSF概况

  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 错误信息表

四、EXCEL的读写操作

1、读取“区域数据.xls”并储存于list集合中,“区域数据.xls”如下图

ylg娱乐官网 1

 1 public List<Area> importXLS(){
 2 
 3     ArrayList<Area> list = new ArrayList<>();
 4     try {
 5      //1、获取文件输入流
 6      InputStream inputStream = new FileInputStream("/Users/Shared/区域数据.xls");
 7      //2、获取Excel工作簿对象
 8         HSSFWorkbook workbook = new HSSFWorkbook(inputStream);
 9      //3、得到Excel工作表对象
10         HSSFSheet sheetAt = workbook.getSheetAt(0);
11         //4、循环读取表格数据
12      for (Row row : sheetAt) {
13        //首行(即表头)不读取
14             if (row.getRowNum() == 0) {
15                 continue;
16             }
17             //读取当前行中单元格数据,索引从0开始
18        String areaNum = row.getCell(0).getStringCellValue(); 
19             String province = row.getCell(1).getStringCellValue();
20             String city = row.getCell(2).getStringCellValue();
21             String district = row.getCell(3).getStringCellValue();
22             String postcode = row.getCell(4).getStringCellValue();
23 
24             Area area = new Area();
25             area.setCity(city);
26             area.setDistrict(district);
27             area.setProvince(province);
28        area.setPostCode(postcode);
29             list.add(area);
30         }
31      //5、关闭流
32         workbook.close();
33     } catch (IOException e) {
34         e.printStackTrace();
35     }
36   return list;
37 }

2、导出数据到“区域数据.xls”文件中,页面数据如下图:

ylg娱乐官网 2

 1 public void exportExcel() throws IOException {
 2 
 3         Page<Area> page = areaService.pageQuery(null);
 4         List<Area> list = page.getContent();
 5 
 6         //1.在内存中创建一个excel文件
 7         HSSFWorkbook hssfWorkbook = new HSSFWorkbook();
 8         //2.创建工作簿
 9         HSSFSheet sheet = hssfWorkbook.createSheet();
10         //3.创建标题行
11         HSSFRow titlerRow = sheet.createRow(0);
12         titlerRow.createCell(0).setCellValue("省");
13         titlerRow.createCell(1).setCellValue("市");
14         titlerRow.createCell(2).setCellValue("区");
15         titlerRow.createCell(3).setCellValue("邮编");
16         titlerRow.createCell(4).setCellValue("简码");
17         titlerRow.createCell(5).setCellValue("城市编码");
18 
19         //4.遍历数据,创建数据行
20         for (Area area : list) {
21             //获取最后一行的行号
22             int lastRowNum = sheet.getLastRowNum();
23             HSSFRow dataRow = sheet.createRow(lastRowNum + 1);
24             dataRow.createCell(0).setCellValue(area.getProvince());
25             dataRow.createCell(1).setCellValue(area.getCity());
26             dataRow.createCell(2).setCellValue(area.getDistrict());
27             dataRow.createCell(3).setCellValue(area.getPostcode());
28             dataRow.createCell(4).setCellValue(area.getShortcode());
29             dataRow.createCell(5).setCellValue(area.getCitycode());
30         }
31         //5.创建文件名
32         String fileName = "区域数据统计.xls";
33         //6.获取输出流对象
34         HttpServletResponse response = ServletActionContext.getResponse();
35         ServletOutputStream outputStream = response.getOutputStream();
36 
37         //7.获取mimeType
38         ServletContext servletContext = ServletActionContext.getServletContext();
39         String mimeType = servletContext.getMimeType(fileName);
40         //8.获取浏览器信息,对文件名进行重新编码
41         HttpServletRequest request = ServletActionContext.getRequest();
42         fileName = FileUtils.filenameEncoding(fileName, request);
43 
44         //9.设置信息头
45         response.setContentType(mimeType);
46         response.setHeader("Content-Disposition","attachment;filename="+fileName);
47         //10.写出文件,关闭流
48         hssfWorkbook.write(outputStream);
49         hssfWorkbook.close();
50     }

工具类

 1 public class FileUtils {
 2 
 3     public static String filenameEncoding(String filename, HttpServletRequest request) throws IOException {
 4         String agent = request.getHeader("User-Agent"); //获取浏览器
 5         if (agent.contains("Firefox")) {
 6             BASE64Encoder base64Encoder = new BASE64Encoder();
 7             filename = "=?utf-8?B?"
 8                     + base64Encoder.encode(filename.getBytes("utf-8"))
 9                     + "?=";
10         } else if(agent.contains("MSIE")) {
11             filename = URLEncoder.encode(filename, "utf-8");
12         } else if(agent.contains ("Safari")) {
13             filename = new String (filename.getBytes ("utf-8"),"ISO8859-1");
14         } else {
15             filename = URLEncoder.encode(filename, "utf-8");
16         }
17         return filename;
18     }
19 }

 写出xls文件:

ylg娱乐官网 3

五、 EXCEL常用操作方法

1、 得到Excel常用对象

 1 POIFSFileSystem fs=newPOIFSFileSystem(new FileInputStream("d:/test.xls")); 
 2 //得到Excel工作簿对象 
 3 HSSFWorkbook wb = new HSSFWorkbook(fs); 
 4 //得到Excel工作表对象 
 5 HSSFSheet sheet = wb.getSheetAt(0); 
 6 //得到Excel工作表的行 
 7 HSSFRow row = sheet.getRow(i); 
 8 //得到Excel工作表指定行的单元格 
 9 HSSFCell cell = row.getCell((short) j); 
10 cellStyle = cell.getCellStyle();//得到单元格样式

2、建立Excel常用对象

1 HSSFWorkbook wb = new HSSFWorkbook();//创建Excel工作簿对象 
2 HSSFSheet sheet = wb.createSheet("new sheet");//创建Excel工作表对象 
3 HSSFRow row = sheet.createRow((short)0); //创建Excel工作表的行 
4 cellStyle = wb.createCellStyle();//创建单元格样式 
5 row.createCell((short)0).setCellStyle(cellStyle); //创建Excel工作表指定行的单元格 
6 row.createCell((short)0).setCellValue(1); //设置Excel工作表的值

3、设置sheet名称和单元格内容

1 wb.setSheetName(1, "第一张工作表",HSSFCell.ENCODING_UTF_16); 
2 cell.setEncoding((short) 1); 
3 cell.setCellValue("单元格内容");

4、取得sheet的数目

1 wb.getNumberOfSheets()

5、 根据index取得sheet对象

1 HSSFSheet sheet = wb.getSheetAt(0);

6、取得有效的行数

1 int rowcount = sheet.getLastRowNum();

7、取得一行的有效单元格个数

1 row.getLastCellNum();

8、单元格值类型读写

1 cell.setCellType(HSSFCell.CELL_TYPE_STRING); //设置单元格为STRING类型 
2 cell.getNumericCellValue();//读取为数值类型的单元格内容 

9、设置列宽、行高

1 sheet.setColumnWidth((short)column,(short)width); 
2 row.setHeight((short)height);

10、添加区域,合并单元格

1 Region region = new Region((short)rowFrom,(short)columnFrom,(short)rowTo 
2 ,(short)columnTo);//合并从第rowFrom行columnFrom列 
3 sheet.addMergedRegion(region);// 到rowTo行columnTo的区域 
4 //得到所有区域 
5 sheet.getNumMergedRegions() 

11、保存Excel文件

1 FileOutputStream fileOut = new FileOutputStream(path); 
2 wb.write(fileOut);

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

 1 public String getCellStringValue(HSSFCell cell) { 
 2   String cellValue = ""; 
 3   switch (cell.getCellType()) { 
 4     case HSSFCell.CELL_TYPE_STRING://字符串类型 
 5         cellValue = cell.getStringCellValue(); 
 6         if(cellValue.trim().equals("")||cellValue.trim().length()<=0) 
 7           cellValue=" "; 
 8         break; 
 9     case HSSFCell.CELL_TYPE_NUMERIC: //数值类型 
10         cellValue = String.valueOf(cell.getNumericCellValue()); 
11         break; 
12     case HSSFCell.CELL_TYPE_FORMULA: //公式 
13         cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC); 
14         cellValue = String.valueOf(cell.getNumericCellValue()); 
15         break; 
16     case HSSFCell.CELL_TYPE_BLANK: 
17         cellValue=" "; 
18         break; 
19     case HSSFCell.CELL_TYPE_BOOLEAN: 
20         break; 
21     case HSSFCell.CELL_TYPE_ERROR: 
22         break; 
23     default: 
24         break; 
25   } 
26   return cellValue; 
27 }

13、常用单元格边框格式

1 HSSFCellStyle style = wb.createCellStyle(); 
2 style.setBorderBottom(HSSFCellStyle.BORDER_DOTTED);//下边框 
3 style.setBorderLeft(HSSFCellStyle.BORDER_DOTTED);//左边框 
4 style.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框 
5 style.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框

14、设置字体和内容位置

 1 HSSFFont f = wb.createFont(); 
 2 f.setFontHeightInPoints((short) 11);//字号 
 3 f.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);//加粗 
 4 style.setFont(f); 
 5 style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//左右居中 
 6 style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//上下居中 
 7 style.setRotation(short rotation);//单元格内容的旋转的角度 
 8 HSSFDataFormat df = wb.createDataFormat(); 
 9 style1.setDataFormat(df.getFormat("0.00%"));//设置单元格数据格式 
10 cell.setCellFormula(string);//给单元格设公式 
11 style.setRotation(short rotation);//单元格内容的旋转的角度

15、插入图片

 1 //先把读进来的图片放到一个ByteArrayOutputStream中,以便产生ByteArray 
 2 ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream(); 
 3 BufferedImage bufferImg = ImageIO.read(new File("ok.jpg")); 
 4 ImageIO.write(bufferImg,"jpg",byteArrayOut); 
 5 //读进一个excel模版 
 6 FileInputStream fos = new FileInputStream(filePathName+"/stencil.xlt"); 
 7 fs = new POIFSFileSystem(fos); 
 8 //创建一个工作薄 
 9 HSSFWorkbook wb = new HSSFWorkbook(fs); 
10 HSSFSheet sheet = wb.getSheetAt(0); 
11 HSSFPatriarch patriarch = sheet.createDrawingPatriarch(); 
12 HSSFClientAnchor anchor = new HSSFClientAnchor(0,0,1023,255,(short) 0,0,(short)10,10); 
13 patriarch.createPicture(anchor , wb.addPicture(byteArrayOut.toByteArray(),HSSFWorkbook.PICTURE_TYPE_JPEG));

16、调整工作表位置

1 HSSFWorkbook wb = new HSSFWorkbook(); 
2 HSSFSheet sheet = wb.createSheet("format sheet"); 
3 HSSFPrintSetup ps = sheet.getPrintSetup(); 
4 sheet.setAutobreaks(true); 
5 ps.setFitHeight((short)1); 
6 ps.setFitWidth((short)1);

 

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

 

2.POI支持的解析方式

  • HSSF解析(.xls Excel97-03版本)

  • XSSF解析(.xlsx Excel07-16版本)

    解析方式不同,是由于两类版本excel文件本身的实现有不同

首先我们来认识一下读取相关文档的jar包:

3.应用场景

  • 导入excel数据

    ​ 将excel中的备份数据还原到数据库

  • 导出excel数据

    ​ 将数据库中的数据导出或备份

 

4. 快速入门:

1. 引用POI包读取word文档内容

Maven坐标

<!--操作97-03版本用-->
<dependency> 
    <groupId>org.apache.poi</groupId> 
    <artifactId>poi</artifactId> 
    <version>3.11</version> 
</dependency>
<!--操作07-16版本用-->
<dependency> 
    <groupId>org.apache.poi</groupId> 
    <artifactId>poi-ooxml</artifactId> 
    <version>3.11</version> 
</dependency>
<!--?-->
<dependency> 
    <groupId>org.apache.poi</groupId> 
    <artifactId>poi-ooxml-schemas</artifactId> 
    <version>3.11</version> 
</dependency>

poi.jar 下载地址

实现步骤:

  1. 创建工作簿
  2. 创建sheet
  3. 创建行对象
  4. 创建单元格对象
  5. 设置内容
  6. 设置内容格式
    ​ 使用wb去创建内容格式,是由于创建出的字体是在工作簿内公共使用的。

    1. 设置字体
    2. 设置字体大小
    3. 创建cellStyle
    4. 将cellStyle赋给cell
  7. 将 工作簿写入输出流
  8. 下载

 
 

简单Demo:

package cn.itcast.jx.poi;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;

public class POITest {

    @SuppressWarnings("resource")
    public static void main(String[] args) throws Exception {
        //1 创建工作薄:Workbook是一个接口,它有一个实现类HSSFWorkbook对象,这个对象专门操作excel97-03,excel的后缀名是xls
        Workbook wb = new HSSFWorkbook();
        //2 创建工作表sheet:工作表
        Sheet sheet = wb.createSheet();
        //3 创建行对象,java中从0开始计数
        Row row = sheet.createRow(3);
        //4 创建列对象
        Cell cell = row.createCell(3);
        //5 设置内容
        cell.setCellValue("itcast,一统江湖");
        //6 设置内容格式
        Font font = wb.createFont();
        font.setFontHeightInPoints((short)24);//以像素点的方式设置字体大小
        font.setFontName("华文彩云");//设置字体

        //System.out.println(Short.MIN_VALUE+"-"+Short.MAX_VALUE);
        //创建格式
        CellStyle cellStyle = wb.createCellStyle();
        cellStyle.setFont(font);

        //将cellStyle给cell
        cell.setCellStyle(cellStyle);
        //7 保存(javase项目采用保存)
        FileOutputStream stream = new FileOutputStream(new File("d://a.xls"));
        wb.write(stream);//将对象写进流

        stream.flush();
        stream.close();
        //8 下载(web项目 才有下载)
        System.out.println("运行结束");
    }
}

 

项目应用Demo:出货单打印:

package cn.itcast.jx.action.cargo;

import java.io.ByteArrayOutputStream;
import java.util.List;

import javax.servlet.http.HttpServletResponse;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.CellRangeAddress;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.struts2.ServletActionContext;
import org.hibernate.type.descriptor.sql.BitTypeDescriptor;

import cn.itcast.jx.action.BaseAction;
import cn.itcast.jx.domain.ContractProduct;
import cn.itcast.jx.service.ContractProductService;
import cn.itcast.jx.util.DownloadUtil;
import cn.itcast.jx.util.UtilFuns;
/**
 * 打印出货表:选择时间(船期)
 */
public class OutProductAction extends BaseAction {
    //获取页面提交的打印月份
    private String inputDate;

    public String getInputDate() {
        return inputDate;
    }
    public void setInputDate(String inputDate) {
        this.inputDate = inputDate;
    }
    //跳转到打印页面
    public String toedit() throws Exception {
        return "toedit";
    }
    //依赖注入
    private ContractProductService contractProductService;

    public void setContractProductService(
            ContractProductService contractProductService) {
        this.contractProductService = contractProductService;
    }
    //打印excel文档:
    @SuppressWarnings("resource")
    public String print() throws Exception {
        //创建工作表
        Workbook wb = new HSSFWorkbook();
        //创建工作表
        Sheet sheet = wb.createSheet();

        //设置列宽
        sheet.setColumnWidth(0, 6*256);
        sheet.setColumnWidth(1, 26*256);
        sheet.setColumnWidth(2, 12*256);
        sheet.setColumnWidth(3, 30*256);
        sheet.setColumnWidth(4, 12*256);
        sheet.setColumnWidth(5, 15*256);
        sheet.setColumnWidth(6, 10*256);
        sheet.setColumnWidth(7, 10*256);
        sheet.setColumnWidth(8, 10*256);

      //定义一些公共变量
        //行对象
        Row nRow = null;
        //单元格对象
        Cell nCell = null;  
        //行号和列号
        int rowNo = 0;
        int cellNo = 1;

        /************大标题的打印**************/
        nRow = sheet.createRow(rowNo);
        nCell = nRow.createCell(cellNo);
        //横向合并单元格
        sheet.addMergedRegion(new CellRangeAddress(0,0,1,8));

        //设置内容:
        //设置内容:
        /**
         * 2012-01:
         * 2012-10:
         * 
         * 方式一:inputDate.replace("-0","-").replace("-","年")
         * 方式二:inputDate.replace("-0","年").replace("-","年")
         * 
         */
        nCell.setCellValue(inputDate.replace("-0","-").replace("-","年")+"月出货表");

        //行高?样式?
        nRow.setHeightInPoints(36f);
        nCell.setCellStyle(bigTitle(wb));

        /************小标题的打印**************/
        //先换行
        rowNo++;
        //创建行对象
        nRow = sheet.createRow(rowNo);

        String[] titles = {"客户","订单号","货号","数量","工厂","工厂交期","船期","贸易条款"};
        //遍历标题,进行输出打印
        for(String title:titles){
            nCell = nRow.createCell(cellNo++);
            nCell.setCellValue(title);
            nCell.setCellStyle(title(wb));
        }

        /************内容的打印**************/
        //准备数据
        //String hql = "from ContractProduct where contract.shipTime like '%"+inputDate+"%'";//mysql支持,oracle不支持
        //hql中有to_char函数吗?没有,这是oracle中的pl/sql函数
        //但是,hibernate强大的地方就在:你可以在HQL中使用数据库中的函数
        String hql = "from ContractProduct where to_char(contract.shipTime,'yyyy-mm') = '"+inputDate+"'";//oracle支持
        //查询:
        List<ContractProduct> list = contractProductService.find(hql, ContractProduct.class, null);

        //将数据放入sheet中
        for(ContractProduct cp:list){
            //行变化
            rowNo++;
            nRow = sheet.createRow(rowNo);
            //列
            cellNo = 1;//规1

            //"客户",
            nCell = nRow.createCell(cellNo++);
            nCell.setCellValue(cp.getContract().getCustomName());
            nCell.setCellStyle(text(wb));

            //"订单号",
            nCell = nRow.createCell(cellNo++);
            nCell.setCellValue(cp.getContract().getContractNo());
            nCell.setCellStyle(text(wb));
            //"货号",
            nCell = nRow.createCell(cellNo++);
            nCell.setCellValue(cp.getProductNo());
            nCell.setCellStyle(text(wb));
            //"数量",
            nCell = nRow.createCell(cellNo++);
            nCell.setCellValue(cp.getCnumber());
            nCell.setCellStyle(text(wb));
            //"工厂",
            nCell = nRow.createCell(cellNo++);
            nCell.setCellValue(cp.getFactoryName());
            nCell.setCellStyle(text(wb));
            //"工厂交期",
            nCell = nRow.createCell(cellNo++);
            //用SimpleDateFormat也行
            nCell.setCellValue(UtilFuns.dateTimeFormat(cp.getContract().getDeliveryPeriod()));
            nCell.setCellStyle(text(wb));
            //"船期",
            nCell = nRow.createCell(cellNo++);
            nCell.setCellValue(UtilFuns.dateTimeFormat(cp.getContract().getShipTime()));
            nCell.setCellStyle(text(wb));
            //"贸易条款"
            nCell = nRow.createCell(cellNo++);
            nCell.setCellValue(cp.getContract().getTradeTerms());
            nCell.setCellStyle(text(wb));

        }


        /************下载**************/
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        //将内容写入流
        wb.write(byteArrayOutputStream);
        //使用流
        DownloadUtil downloadUtil = new DownloadUtil();

        HttpServletResponse response = ServletActionContext.getResponse();

        /**
         * 第一个:文件流
         * 第二个:response
         * 第三个:下载的文件的名字
         */
        downloadUtil.download(byteArrayOutputStream, response, "itcast.xls");

        return NONE;
    }
    //大标题的样式
    public CellStyle bigTitle(Workbook wb){
        CellStyle style = wb.createCellStyle();
        Font font = wb.createFont();
        font.setFontName("宋体");
        font.setFontHeightInPoints((short)16);
        font.setBoldweight(Font.BOLDWEIGHT_BOLD);                   //字体加粗

        style.setFont(font);

        style.setAlignment(CellStyle.ALIGN_CENTER);                 //横向居中
        style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);      //纵向居中

        return style;
    }
    //小标题的样式
    public CellStyle title(Workbook wb){
        CellStyle style = wb.createCellStyle();
        Font font = wb.createFont();
        font.setFontName("黑体");
        font.setFontHeightInPoints((short)12);

        style.setFont(font);

        style.setAlignment(CellStyle.ALIGN_CENTER);                 //横向居中
        style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);      //纵向居中

        style.setBorderTop(CellStyle.BORDER_THIN);                  //上细线
        style.setBorderBottom(CellStyle.BORDER_THIN);               //下细线
        style.setBorderLeft(CellStyle.BORDER_THIN);                 //左细线
        style.setBorderRight(CellStyle.BORDER_THIN);                //右细线

        return style;
    }

    //文字样式
    public CellStyle text(Workbook wb){
        CellStyle style = wb.createCellStyle();
        Font font = wb.createFont();
        font.setFontName("Times New Roman");
        font.setFontHeightInPoints((short)10);

        style.setFont(font);

        style.setAlignment(CellStyle.ALIGN_LEFT);                   //横向居左
        style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);      //纵向居中

        style.setBorderTop(CellStyle.BORDER_THIN);                  //上细线
        style.setBorderBottom(CellStyle.BORDER_THIN);               //下细线
        style.setBorderLeft(CellStyle.BORDER_THIN);                 //左细线
        style.setBorderRight(CellStyle.BORDER_THIN);                //右细线

        return style;
    }
}

2.引用jxl包读取excel文档的内容

5.使用模板的实现

​ 模板即是一个已经设置好部分样式的excel文档。
​ 标题行,列宽行高,字体颜色等可以在模板中先设置好。

Jxl.jar下载地址

步骤

  1. ylg娱乐官网,制作模板文件

  2. 读取模板文件,获取工作簿

    //路径
    String path = ServletActionContext.getRequest().getRealPath("/");
    path += "/make/xlsprint/tOUTPRODUCT.xls";
    //输入流
    FileInputStream is = new FileInputStream(new File(path));    
    //借助模板创建工作簿
    Workbook wb = new HSSFWorkbook(is);
    
  3. 获取sheet

    Sheet sheet = wb.getSheetAt(0);
    
  4. 获取行

  5. 获取某单元格的格式

    CellStyle customerCellStyle = nRow.getCell(cellNo++).getCellStyle();
    
  6. 设置内容及格式

  7. 将工作簿写入输出流

  8. 下载

项目应用Demo:

    @SuppressWarnings("resource")
    public String print() throws Exception {
        //读取模板,路径
        String path = ServletActionContext.getRequest().getRealPath("/");
        path += "/make/xlsprint/tOUTPRODUCT.xls";//获取模板在服务器的路径

        FileInputStream is = new FileInputStream(new File(path));

        //1 借助模板创建工作簿
        Workbook wb = new HSSFWorkbook(is);
        //2 获取工作表
        Sheet sheet = wb.getSheetAt(0);

        //定义公共变量
        Row nRow = null;//行对象
        Cell nCell = null;//单元格对象

        int rowNo = 0;//第几行
        int cellNo = 1;//列对象

        /*******************设置大标题********************/
        //3 获取行对象
        nRow = sheet.getRow(rowNo);
        //4 获取单元格
        nCell = nRow.getCell(cellNo);   
        // 5 设置数据
        nCell.setCellValue(inputDate.replace("-0", "-").replace("-", "年")+"月份出货表");
        // 6 设置样式,获取原来的样式赋值,这步可以省略
        //nCell.setCellStyle(nCell.getCellStyle());

        /*******************设置小标题********************/
        rowNo++;//跳过小标题行,因为模板中已经设置好 

        /*******************设置出货数据********************/
        rowNo++;//进入数据第一行行
        //获取样式
        nRow = sheet.getRow(rowNo);

        //客户    
        CellStyle customerCellStyle = nRow.getCell(cellNo++).getCellStyle();
        //订单号   
        CellStyle contractNoCellStyle = nRow.getCell(cellNo++).getCellStyle();
        //货号    
        CellStyle productNoCellStyle = nRow.getCell(cellNo++).getCellStyle();
        //数量    
        CellStyle cnumberCellStyle = nRow.getCell(cellNo++).getCellStyle();
        //工厂    
        CellStyle factoryCellStyle = nRow.getCell(cellNo++).getCellStyle();
        //工厂交期  
        CellStyle deliveryPeriodCellStyle = nRow.getCell(cellNo++).getCellStyle();
        //船期    
        CellStyle shipTimeCellStyle = nRow.getCell(cellNo++).getCellStyle();
        //贸易条款
        CellStyle tradeTermsCellStyle = nRow.getCell(cellNo++).getCellStyle();

        // 准备数据
        //mysql方式(oracle不支持):
        //String hql = "from ContractProduct where contract.shipTime like '%"+inputDate+"%'";
        //Oracle方式:to_char可以将Date转成varchar,oracle中的所有的PL/SQL函数都可以直接写在hql语句中
        String hql = "from ContractProduct where to_char(contract.shipTime,'yyyy-mm')='"+inputDate+"'";
        //从数据库查找要输出的货物的集合
        List<ContractProduct> list = contractProductService.find(hql, ContractProduct.class, null);
        for(ContractProduct cp:list){
            //单元格no归1
            cellNo = 1;         
            //一条数据创建一行
            nRow = sheet.createRow(rowNo);
            //创建每列的数据
            //客户    
            nCell = nRow.createCell(cellNo++);
            nCell.setCellValue(cp.getContract().getCustomName());
            nCell.setCellStyle(customerCellStyle);          
            //订单号   
            nCell = nRow.createCell(cellNo++);
            nCell.setCellValue(cp.getContract().getContractNo());
            nCell.setCellStyle(contractNoCellStyle);
            //货号    
            nCell = nRow.createCell(cellNo++);
            nCell.setCellValue(cp.getProductNo());
            nCell.setCellStyle(productNoCellStyle);
            //数量    
            nCell = nRow.createCell(cellNo++);
            nCell.setCellValue(cp.getCnumber());
            nCell.setCellStyle(cnumberCellStyle);
            //工厂    
            nCell = nRow.createCell(cellNo++);
            nCell.setCellValue(cp.getFactoryName());
            nCell.setCellStyle(factoryCellStyle);
            //工厂交期  
            nCell = nRow.createCell(cellNo++);
            nCell.setCellValue(UtilFuns.dateTimeFormat(cp.getContract().getDeliveryPeriod()));
            nCell.setCellStyle(deliveryPeriodCellStyle);

            //船期    
            nCell = nRow.createCell(cellNo++);
            nCell.setCellValue(UtilFuns.dateTimeFormat(cp.getContract().getShipTime()));
            nCell.setCellStyle(shipTimeCellStyle);
            //贸易条款
            nCell = nRow.createCell(cellNo++);
            nCell.setCellValue(cp.getContract().getTradeTerms());
            nCell.setCellStyle(tradeTermsCellStyle);

            //切到下一行,准备下一行数据操作
            rowNo++;
        }


        /***************************************************/
        // 7.写入流
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();//字节数组缓冲流
        wb.write(byteArrayOutputStream);        
        // 8.下载
        DownloadUtil downloadUtil = new DownloadUtil();
        HttpServletResponse response = ServletActionContext.getResponse();
        /**
         * 第一个参数:流
         * 第二个参数:response
         * 第三个参数:下载的文件名
         */
        downloadUtil.download(byteArrayOutputStream, response, "出货表.xls");

        return NONE;
    }

 

3.引用PDFBox读取pdf文档的内容

Pdfbox.jar下载地址

 
 

Fontbox.jar下载地址

 
 

Jempbox.jar下载地址

 
 

下面我们就来简单看一下这些jar包的对文档的读取的应用实例:

 

1. 引用POI包读取word文档内容

 

  1. import java.io.File;     
  2. import java.io.FileInputStream;     
  3. import org.apache.poi.hwpf.HWPFDocument;     
  4. import org.apache.poi.hwpf.usermodel.Range;     
  5.   
  6. /**  
  7. *  
  8. * @author 曹胜欢 
  9. */   
  10. public class DocFile{     
  11.   
  12.   
  13.     @Override   
  14.     public String getContent(File f) throws Exception {     
  15.         FileInputStream fis = new FileInputStream(f);     
  16.         HWPFDocument doc = new HWPFDocument(fis);     
  17.         Range rang = doc.getRange();     
  18.         String text = rang.text();     
  19.         fis.close();     
  20.         return text;     
  21.     }     

2.引用jxl包读取excel文档的内容

 

  1. import java.io.File;     
  2. import java.io.FileInputStream;     
  3. import jxl.Cell;     
  4. import jxl.Sheet;     
  5. import jxl.Workbook;     
  6.   
  7. /**  
  8. *  
  9. * @author 曹胜欢 
  10. */   
  11. public class XlsFile{     
  12.   
  13.     @Override     
  14.     public String getContent(File f) throws Exception {     
  15.      //构建Workbook对象, 只读Workbook对象  
  16.      //直接从本地文件创建Workbook  
  17.       //从输入流创建Workbook  
  18.   
  19.         FileInputStream fis = new FileInputStream(f);     
  20.         StringBuilder sb = new StringBuilder();     
  21.         jxl.Workbook rwb = Workbook.getWorkbook(fis);     
  22. //一旦创建了Workbook,我们就可以通过它来访问  
  23. //Excel Sheet的数组集合(术语:工作表),  
  24. //也可以调用getsheet方法获取指定的工资表  
  25.         Sheet[] sheet = rwb.getSheets();     
  26.         for (int i = 0; i < sheet.length; i++) {     
  27.             Sheet rs = rwb.getSheet(i);     
  28.             for (int j = 0; j < rs.getRows(); j++) {     
  29.                Cell[] cells = rs.getRow(j);     
  30.                for(int k=0;k<cells.length;k++)     
  31.                sb.append(cells[k].getContents());     
  32.             }     
  33.         }     
  34.         fis.close();     
  35.         return sb.toString();     
  36.     }     
  37.   
  38. }  

 

由上面代码我们可知:一旦得到了Sheet,我们就可以通过它来访问Excel Cell(术语:单元格)。参考下面的代码片段:
//获取第一行,第一列的值
Cell c00 = rs.getCell(0, 0);
String strc00 = c00.getContents();
//获取第一行,第二列的值
Cell c10 = rs.getCell(1, 0);
String strc10 = c10.getContents();
当你完成对Excel电子表格数据的处理后,一定要使用close()方法来关闭先前创建的对象,以释放读取数据表的过程中所占用的内存空间,在读取大量数据时显得尤为重要。

 

3.引用PDFBox读取pdf文档的内容

 

  1. import java.io.File;     
  2. import java.io.FileInputStream;     
  3. import org.pdfbox.pdfparser.PDFParser;     
  4. import org.pdfbox.pdmodel.PDDocument;     
  5. import org.pdfbox.util.PDFTextStripper;     
  6.   
  7. /**  
  8. *  
  9. * @author 曹胜欢 
  10. */   
  11. <pre name=”code” class=”java”>public class PdfFile{     
  12.   
  13.     public String getContent(File f) throws Exception {     
  14.         FileInputStream fis = new FileInputStream(f);     
  15.         PDFParser p = new PDFParser(fis);     
  16.         p.parse();     
  17.         PDDocument pdd = p.getPDDocument();     
  18.         PDFTextStripper ts = new PDFTextStripper();     
  19.         String c = ts.getText(pdd);     
  20.         pdd.close();     
  21.         fis.close();     
  22.         return c;     
  23.     }     
  24. }</pre><br>  

我们简单介绍了java读取word,excel和pdf文档内容 ,但在实际开发中,我们用到最多的是把数据库中数据导出excel报表形式。不仅仅简单的读取office中的数据.尤其是在生产管理或者财务系统中用的非常普遍,因为这些系统经常要做一些报表打印的工作。而数据导出的格式一般是EXCEL或者PDF 。所以今天我们来简单看一下利用Apache  POI实现数据库中数据导出excel报表。在Java中有很多实现数据导出excel报表的第三方jar包。但在比较了一下感觉还是POI相对来说比较好用。如果大家想学习其他的导出方式可以自行研究一下。

 

首先来了解一下 Apache POI

 

     Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能。Apache POI 是创建和维护操作各种符合Office Open XML(OOXML)标准和微软的OLE 2复合文档格式(OLE2)的Java API。用它可以使用Java读取和创建,修改MS Excel文件.而且,还可以使用Java读取和创建MS Word和MSPowerPoint文件。Apache POI 提供Java操作Excel解决方案(适用于Excel97-2008)。 下面我们来看一下Apache POI 中提供的几大部分的作用:

发表评论

电子邮件地址不会被公开。 必填项已用*标注