2017-07-14 11:38:59 imthemostshuaiin626 阅读数 824
  • 基于SSM的POI导入导出Excel实战

    本课程将给大家分享如何基于SSM实现POI导入导出Excel,并讲解目前企业级JavaWeb应用mvc三层模式的开发流程,可让初学者或者职场萌新掌握如何基于SSM整合第三方框架并采用mvc三层开发模式实现自己的业务模块!

    1269 人正在学习 去看看 钟林森

lz所使用的工具包是poi

maven依赖:

    <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.8</version>
            <exclusions>
                <exclusion>
                    <artifactId>commons-codec</artifactId>
                    <groupId>commons-codec</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.8</version>
        </dependency>

范例代码

public static void main(String[] args) throws ParseException {
           //创建一个HSSF,对应一个excel
           HSSFWorkbook workbook = new HSSFWorkbook();
           //在webbook中添加一个sheet,对应Excel文件中的sheet
           HSSFSheet sheet = workbook.createSheet("学生表");
           //在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short
           HSSFRow row = sheet.createRow((int) 0);
           //创建单元格,并设置值表头 设置表头居中
           HSSFCellStyle style = workbook.createCellStyle();
           style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 创建一个居中格式

           HSSFCell cell = row.createCell(0);
           cell.setCellValue("学号");
           cell.setCellStyle(style);
           cell = row.createCell(1);
           cell.setCellValue("姓名");
           cell.setCellStyle(style);
           cell = row.createCell(2);
           cell.setCellValue("年龄");
           cell.setCellStyle(style);
           cell = row.createCell(3);
           cell.setCellValue("生日");
           cell.setCellStyle(style);

           //写入实体数据
           List list = DemoDaoImpl.getStudent();

           for (int i = 0; i < list.size(); i++)
        {
            row = sheet.createRow((int) i + 1);
            Student stu = (Student) list.get(i);
            //创建单元格,并设置值
            row.createCell(0).setCellValue((double) stu.getId());
            row.createCell(1).setCellValue(stu.getName());
            row.createCell(2).setCellValue((double) stu.getAge());
            cell = row.createCell(3);
            cell.setCellValue(new SimpleDateFormat("yyyy-MM-dd").format(stu
                    .getBirth()));
        }
        //将文件存到指定位置
        try
        {
            FileOutputStream fout = new FileOutputStream("D:/students.xls");
            workbook.write(fout);
            fout.close();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
     }

运行结果

运行结果

2018-11-02 14:52:37 xcc_2269861428 阅读数 170
  • 基于SSM的POI导入导出Excel实战

    本课程将给大家分享如何基于SSM实现POI导入导出Excel,并讲解目前企业级JavaWeb应用mvc三层模式的开发流程,可让初学者或者职场萌新掌握如何基于SSM整合第三方框架并采用mvc三层开发模式实现自己的业务模块!

    1269 人正在学习 去看看 钟林森
package poi.test;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

/**
 * 写入文件
 * @author xuchangcheng
 * 2018年11月2日
 */
public class WritePoi {
    
	/**
	 * 准备数据
	 * @return
	 */
	public List<Map<String,Object>> data(){
		List<Map<String,Object>> list = new ArrayList<>();
		Map<String,Object> map = new HashMap<>();
		map.put("name", "测试01");
		map.put("age", 25);
		list.add(map);
		
		Map<String,Object> map1 = new HashMap<>();
		map1.put("name", "测试02");
		map1.put("age", 22);
		list.add(map1);
		
		Map<String,Object> map2 = new HashMap<>();
		map2.put("name", "测试03");
		map2.put("age", 23);
		list.add(map2);
		
		return list;
	}
	
	
	public void writeData2Excel(){
		String resultPath = "E:/key/2010表格.xls";
		String[] title={"姓名","年龄"}; //表头
		//创建工作簿
		HSSFWorkbook workbook=new HSSFWorkbook();
		//创建sheet
		HSSFSheet sheet=workbook.createSheet("sheet");
		//创建第一行
		HSSFRow row=sheet.createRow(0);
		HSSFCell cell=null;
		//插入第一行数据的表头
		for(int i=0;i<title.length;i++){
		    cell=row.createCell(i);
		    cell.setCellValue(title[i]);
		}
		List<Map<String,Object>> data = data();
		for(int i=1;i<=data.size();i++){
			HSSFRow row2=sheet.createRow(i);
		    HSSFCell cell0=row2.createCell(0);
		    cell0.setCellValue(data.get(i-1).get("name").toString());
		    cell0=row2.createCell(1);
		    cell0.setCellValue(data.get(i-1).get("age").toString());
		}
		try {
			FileOutputStream fileOutputStream = new FileOutputStream(resultPath);
			workbook.write(fileOutputStream);
			fileOutputStream.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		WritePoi w = new WritePoi();
		w.writeData2Excel();
		System.out.println("wancheng");
	}
}

测试结果

2019-04-21 11:21:18 qq_44884269 阅读数 149
  • 基于SSM的POI导入导出Excel实战

    本课程将给大家分享如何基于SSM实现POI导入导出Excel,并讲解目前企业级JavaWeb应用mvc三层模式的开发流程,可让初学者或者职场萌新掌握如何基于SSM整合第三方框架并采用mvc三层开发模式实现自己的业务模块!

    1269 人正在学习 去看看 钟林森

首先给大家分享一个巨牛巨牛的人工智能教程,是我无意中发现的。教程不仅零基础,通俗易懂,而且非常风趣幽默,还时不时有内涵段子,像看小说一样,哈哈~我正在学习中,觉得太牛了,所以分享给大家!点这里可以跳转到教程

               

在java数据库编程中,常常会用到向excel中读写数据,一方面可以将数据从数据库导出到Excel,进行数据展示,另一方面可以批量的向数据库插入多条数据,这对于软件开发是必不可少的,今天先介绍如何使用java向excel中写入数据,这里以2003版本的excel版本为例,分享我的实战经验。(在后续的经验中会介绍excel数据导出,敬请浏览)

工具/原料

  • eclipse, java poi的jar包

方法/步骤

  1. 1

    导入POI的jar包

    新建一个项目,在根目录在新建一个lib文件夹,将jar包复制粘贴到lib文件夹后,右键将其添加到项目的build path中,最后的结果如图所示:

  2. 2

    编写java类,新建一个实体类,比如我们要导出数据库的有关电脑的信息,那么就建一个Computer实体类,代码如下:

    package com.qiang.poi;

    public class Computer {

     private int id;

     private String name;

     private String description;

     private double price;

     private double credit;

     public int getId() {

      return id;

     }

     public Computer(int id, String name, String description, double price,

       double credit) {

      super();

      this.id = id;

      this.name = name;

      this.description = description;

      this.price = price;

      this.credit = credit;

     }

     public void setId(int id) {

      this.id = id;

     }

     public String getName() {

      return name;

     }

     public void setName(String name) {

      this.name = name;

     }

     public String getDescription() {

      return description;

     }

     public void setDescription(String description) {

      this.description = description;

     }

     public double getPrice() {

      return price;

     }

     public void setPrice(double price) {

      this.price = price;

     }

     public double getCredit() {

      return credit;

     }

     public void setCredit(double credit) {

      this.credit = credit;

     }

    }

  3. 3

    新建一个写入excel的方法,如write2excel,参数可以后面边写边决定(站在一个不熟悉POI的角度)

    public static void write2Excel(){}                                 

  4. 4

    创建操作Excel的HSSFWorkbook对象

    HSSFWorkbook excel= new HSSFWorkbook();

  5. 5

    创建HSSFSheet对象

    Excel中的一个sheet(工作表)对应着java中的一个HSSFSheet对象,利用HSSFWorkbook对象可以创建一个HSSFSheet对象

        如:创建一个sheet名为computer的excel  

    HSSFSheet sheet = excel.createSheet("computer");

  6. 6

    创建第一行标题信息的HSSFRow对象

    我们都知道excel是表格,即由一行一行组成的,那么这一行在java类中就是一个HSSFRow对象,我们通过HSSFSheet对象就可以创建HSSFRow对象

        如:创建表格中的第一行(我们常用来做标题的行)  HSSFRow firstRow = sheet.createRow(0); 注意下标从0开始

  7. 7

    创建标题行中的HSSFCell数组

    当然,excel中每一行是由若干个单元格,我们常称为cell,它对应着java中的HSSFCell对象

        如:创建5个单元格       HSSFCell cells[] = new HSSFCell[5]; 

    //假设我们一行有五列数据

  8. 8

    创建标题数据,并通过HSSFCell对象的setCellValue()方法对每个单元格进行赋值

    既然单元格都准备好了,那最后是不是该填充数据了呀。对的,没错。填充数据之前,得把数据准备好吧,

        数据:String[] titles = new String[]{"id","name","description","price","credit"};

        插入一句话: 在这个时代,能让机器做的,尽量不让人来做,记住这句话。

        好的,继续。现在就通过for循环来填充第一行标题的数据

    for (int i = 0; i < 5; i++) {

       cells[0] = firstRow.createCell(i);

       cells[0].setCellValue(titles[i]);

      }

  9. 9

    数据分析

    第一行标题栏创建完毕后,就准备填充我们要写入的数据吧,在java中,面向对象给我们带来的好处在这里正好体现了,没错

    把要填写的数据封装在对象中,即一行就是一个对象,n行就是一个对象列表嘛,好的,走起。

    创建对象Computer,私有属性id,name,description,price,credit,以及各属性的setter和getter方法,如步骤二所示。

    假设我们要写入excel中的数据从数据库查询出来的,最后就生成了一个List<Computer>对象computers

  10. 10

    数据写入

    具体数据有了,又该让机器帮我们干活了,向excel中写入数据。

    for (int i = 0; i < computers.size(); i++) {

       HSSFRow row = sheet.createRow(i + 1);

       Computer computer = computers.get(i);

       HSSFCell cell = row.createCell(0);

       cell.setCellValue(computer.getId());

       cell = row.createCell(1);

       cell.setCellValue(computer.getName());

       cell = row.createCell(2);

       cell.setCellValue(computer.getDescription());

       cell = row.createCell(3);

       cell.setCellValue(computer.getPrice());

       cell = row.createCell(4);

       cell.setCellValue(computer.getCredit());

      }

  11. 11

    将数据真正的写入excel文件中

    做到这里,数据都写好了,最后就是把HSSFWorkbook对象excel写入文件中了。

            OutputStream out = null;

            try {

                out = new FileOutputStream(file);

                excel.write(out);

                out.close();

            } catch (FileNotFoundException e) {

                e.printStackTrace();

            } catch (IOException e) {

                // TODO Auto-generated catch block

                e.printStackTrace();

            }

            System.out.println("数据已经写入excel"); //温馨提示

  12. 12

    看看我的main方法吧

    public static void main(String[] args) throws IOException {

      File file = new File("test1.xls");

      if(!file.exists()){

       file.createNewFile();

      }

      List<Computer> computers = new ArrayList<Computer>();

      computers.add(new Computer(1,"宏碁","笔记本电脑",3333,9.0));

      computers.add(new Computer(2,"苹果","笔记本电脑,一体机",8888,9.6));

      computers.add(new Computer(3,"联想","笔记本电脑,台式机",4444,9.3));

      computers.add(new Computer(4, "华硕", "笔记本电脑,平板电脑",3555,8.6));

      computers.add(new Computer(5, "注解", "以上价格均为捏造,如有雷同,纯属巧合", 1.0, 9.9));

      write2excel(computers, file);

     }

  13. 13

    工程目录及执行main方法后的test1.xls数据展示

  14. 14

    源码分享,computer就不贴了

    package com.qiang.poi;

    import java.io.File;

    import java.io.FileNotFoundException;

    import java.io.FileOutputStream;

    import java.io.IOException;

    import java.io.OutputStream;

    import java.util.ArrayList;

    import java.util.List;

    import org.apache.poi.hssf.usermodel.HSSFCell;

    import org.apache.poi.hssf.usermodel.HSSFRow;

    import org.apache.poi.hssf.usermodel.HSSFSheet;

    import org.apache.poi.hssf.usermodel.HSSFWorkbook;

    public class ReadExcel {

     public static void main(String[] args) throws IOException {

      File file = new File("test1.xls");

      if(!file.exists()){

       file.createNewFile();

      }

      List<Computer> computers = new ArrayList<Computer>();

      computers.add(new Computer(1,"宏碁","笔记本电脑",3333,9.0));

      computers.add(new Computer(2,"苹果","笔记本电脑,一体机",8888,9.6));

      computers.add(new Computer(3,"联想","笔记本电脑,台式机",4444,9.3));

      computers.add(new Computer(4, "华硕", "笔记本电脑,平板电脑",3555,8.6));

      computers.add(new Computer(5, "注解", "以上价格均为捏造,如有雷同,纯属巧合", 1.0, 9.9));

      write2excel(computers, file);

     }

     

     public static void write2excel(List<Computer> computers,File file) {

      HSSFWorkbook excel = new HSSFWorkbook();

      HSSFSheet sheet = excel.createSheet("computer");

      HSSFRow firstRow = sheet.createRow(0);

      HSSFCell cells[] = new HSSFCell[5];

      String[] titles = new String[] { "id", "name", "description", "price",

        "credit" };

      for (int i = 0; i < 5; i++) {

       cells[0] = firstRow.createCell(i);

       cells[0].setCellValue(titles[i]);

      }

      for (int i = 0; i < computers.size(); i++) {

       HSSFRow row = sheet.createRow(i + 1);

       Computer computer = computers.get(i);

       HSSFCell cell = row.createCell(0);

       cell.setCellValue(computer.getId());

       cell = row.createCell(1);

       cell.setCellValue(computer.getName());

       cell = row.createCell(2);

       cell.setCellValue(computer.getDescription());

       cell = row.createCell(3);

       cell.setCellValue(computer.getPrice());

       cell = row.createCell(4);

       cell.setCellValue(computer.getCredit());

      }

            OutputStream out = null;

            try {

                out = new FileOutputStream(file);

                excel.write(out);

                out.close();

            } catch (FileNotFoundException e) {

                e.printStackTrace();

            } catch (IOException e) {

                e.printStackTrace();

            }

     }

    }

           

浏览人工智能教程

2017-06-21 19:00:00 ajing4030 阅读数 837
  • 基于SSM的POI导入导出Excel实战

    本课程将给大家分享如何基于SSM实现POI导入导出Excel,并讲解目前企业级JavaWeb应用mvc三层模式的开发流程,可让初学者或者职场萌新掌握如何基于SSM整合第三方框架并采用mvc三层开发模式实现自己的业务模块!

    1269 人正在学习 去看看 钟林森

2007格式:

excel2007文件格式与之前版本不同,之前版本采用的是微软自己的存储格式。07版内容的存储采用XML格式,所以,理所当然的,对大数据量的xlsx文件的读取采用的也是XML的处理方式SAX。

    同之前的版本一样,大数据量文件的读取采用的是事件模型eventusermodel。usermodel模式需要将文件一次性全部读到内存中,07版的既然采用的存储模式是xml,解析用的DOM方式也是如此,这种模式操作简单,容易上手,但是对于大量数据占用的内存也是相当可观,在Eclipse中经常出现内存溢出。

    下面就是采用eventusermodel对07excel文件读取。

    同上篇,我将当前行的单元格数据存储到List中,抽象出 optRows 方法,该方法会在每行末尾时调用,方法参数为当前行索引curRow(int型)及存有行内单元格数据的List。继承类只需实现该行级方法即可。

  1. package com.gaosheng.util.xls;  
  2.   
  3. import java.io.InputStream;  
  4. import java.sql.SQLException;  
  5. import java.util.ArrayList;  
  6. import java.util.Iterator;  
  7. import java.util.List;  
  8.   
  9. import org.apache.poi.xssf.eventusermodel.XSSFReader;  
  10. import org.apache.poi.xssf.model.SharedStringsTable;  
  11. import org.apache.poi.xssf.usermodel.XSSFRichTextString;  
  12. import org.apache.poi.openxml4j.opc.OPCPackage;  
  13. import org.xml.sax.Attributes;  
  14. import org.xml.sax.InputSource;  
  15. import org.xml.sax.SAXException;  
  16. import org.xml.sax.XMLReader;  
  17. import org.xml.sax.helpers.DefaultHandler;  
  18. import org.xml.sax.helpers.XMLReaderFactory;  
  19.   
  20. /** 
  21.  * XSSF and SAX (Event API) 
  22.  */  
  23. public abstract class XxlsAbstract extends DefaultHandler {  
  24.     private SharedStringsTable sst;  
  25.     private String lastContents;  
  26.     private boolean nextIsString;  
  27.   
  28.     private int sheetIndex = -1;  
  29.     private List<String> rowlist = new ArrayList<String>();  
  30.     private int curRow = 0;     //当前行  
  31.     private int curCol = 0;     //当前列索引  
  32.     private int preCol = 0;     //上一列列索引  
  33.     private int titleRow = 0;   //标题行,一般情况下为0  
  34.     private int rowsize = 0;    //列数  
  35.       
  36.     //excel记录行操作方法,以行索引和行元素列表为参数,对一行元素进行操作,元素为String类型  
  37. //  public abstract void optRows(int curRow, List<String> rowlist) throws SQLException ;  
  38.       
  39.     //excel记录行操作方法,以sheet索引,行索引和行元素列表为参数,对sheet的一行元素进行操作,元素为String类型  编写自己的业务
  40.     public abstract void optRows(int sheetIndex,int curRow, List<String> rowlist) throws SQLException;  
  41.       
  42.     //只遍历一个sheet,其中sheetId为要遍历的sheet索引,从1开始,1-3  
  43.     public void processOneSheet(String filename,int sheetId) throws Exception {  
  44.         OPCPackage pkg = OPCPackage.open(filename);  
  45.         XSSFReader r = new XSSFReader(pkg);  
  46.         SharedStringsTable sst = r.getSharedStringsTable();  
  47.           
  48.         XMLReader parser = fetchSheetParser(sst);  
  49.   
  50.         // rId2 found by processing the Workbook  
  51.         // 根据 rId# 或 rSheet# 查找sheet  
  52.         InputStream sheet2 = r.getSheet("rId"+sheetId);  
  53.         sheetIndex++;  
  54.         InputSource sheetSource = new InputSource(sheet2);  
  55.         parser.parse(sheetSource);  
  56.         sheet2.close();  
  57.     }  
  58.   
  59.     /** 
  60.      * 遍历 excel 文件 
  61.      */  
  62.     public void process(String filename) throws Exception {  
  63.         OPCPackage pkg = OPCPackage.open(filename);  
  64.         XSSFReader r = new XSSFReader(pkg);  
  65.         SharedStringsTable sst = r.getSharedStringsTable();  
  66.   
  67.         XMLReader parser = fetchSheetParser(sst);  
  68.   
  69.         Iterator<InputStream> sheets = r.getSheetsData();  
  70.         while (sheets.hasNext()) {  
  71.             curRow = 0;  
  72.             sheetIndex++;  
  73.             InputStream sheet = sheets.next();  
  74.             InputSource sheetSource = new InputSource(sheet);  
  75.             parser.parse(sheetSource);  
  76.             sheet.close();  
  77.         }  
  78.     }  
  79.   
  80.     public XMLReader fetchSheetParser(SharedStringsTable sst)  
  81.             throws SAXException {  
  82.         XMLReader parser = XMLReaderFactory  
  83.                 .createXMLReader("org.apache.xerces.parsers.SAXParser");  
  84.         this.sst = sst;  
  85.         parser.setContentHandler(this);  
  86.         return parser;  
  87.     }  
  88.   
  89.     public void startElement(String uri, String localName, String name,  
  90.             Attributes attributes) throws SAXException {  
  91.         // c => 单元格  
  92.         if (name.equals("c")) {  
  93.             // 如果下一个元素是 SST 的索引,则将nextIsString标记为true  
  94.             String cellType = attributes.getValue("t");  
  95.             String rowStr = attributes.getValue("r");  
  96.             curCol = this.getRowIndex(rowStr);  
  97.             if (cellType != null && cellType.equals("s")) {  
  98.                 nextIsString = true;  
  99.             } else {  
  100.                 nextIsString = false;  
  101.             }  
  102.         }  
  103.         // 置空  
  104.         lastContents = "";  
  105.     }  
  106.   
  107.     public void endElement(String uri, String localName, String name)  
  108.             throws SAXException {  
  109.         // 根据SST的索引值的到单元格的真正要存储的字符串  
  110.         // 这时characters()方法可能会被调用多次  
  111.         if (nextIsString) {  
  112.             try {  
  113.                 int idx = Integer.parseInt(lastContents);  
  114.                 lastContents = new XSSFRichTextString(sst.getEntryAt(idx))  
  115.                         .toString();  
  116.             } catch (Exception e) {  
  117.   
  118.             }  
  119.         }  
  120.   
  121.         // v => 单元格的值,如果单元格是字符串则v标签的值为该字符串在SST中的索引  
  122.         // 将单元格内容加入rowlist中,在这之前先去掉字符串前后的空白符  
  123.         if (name.equals("v")) {  
  124.             String value = lastContents.trim();  
  125.             value = value.equals("")?" ":value;  
  126.             int cols = curCol-preCol;  
  127.             if (cols>1){  
  128.                 for (int i = 0;i < cols-1;i++){  
  129.                     rowlist.add(preCol,"");  
  130.                 }  
  131.             }  
  132.             preCol = curCol;  
  133.             rowlist.add(curCol-1, value);  
  134.         }else {  
  135.             //如果标签名称为 row ,这说明已到行尾,调用 optRows() 方法  
  136.             if (name.equals("row")) {  
  137.                 int tmpCols = rowlist.size();  
  138.                 if(curRow>this.titleRow && tmpCols<this.rowsize){  
  139.                     for (int i = 0;i < this.rowsize-tmpCols;i++){  
  140.                         rowlist.add(rowlist.size(), "");  
  141.                     }  
  142.                 }  
  143.                 try {  
  144.                     optRows(sheetIndex,curRow,rowlist);  
  145.                 } catch (SQLException e) {  
  146.                     e.printStackTrace();  
  147.                 }  
  148.                 if(curRow==this.titleRow){  
  149.                     this.rowsize = rowlist.size();  
  150.                 }  
  151.                 rowlist.clear();  
  152.                 curRow++;  
  153.                 curCol = 0;  
  154.                 preCol = 0;  
  155.             }  
  156.         }  
  157.     }  
  158.   
  159.     public void characters(char[] ch, int start, int length)  
  160.             throws SAXException {  
  161.         //得到单元格内容的值  
  162.         lastContents += new String(ch, start, length);  
  163.     }  
  164.       
  165.     //得到列索引,每一列c元素的r属性构成为字母加数字的形式,字母组合为列索引,数字组合为行索引,  
  166.     //如AB45,表示为第(A-A+1)*26+(B-A+1)*26列,45行  
  167.     public int getRowIndex(String rowStr){  
  168.         rowStr = rowStr.replaceAll("[^A-Z]""");  
  169.         byte[] rowAbc = rowStr.getBytes();  
  170.         int len = rowAbc.length;  
  171.         float num = 0;  
  172.         for (int i=0;i<len;i++){  
  173.             num += (rowAbc[i]-'A'+1)*Math.pow(26,len-i-1 );  
  174.         }  
  175.         return (int) num;  
  176.     }  
  177.   
  178.     public int getTitleRow() {  
  179.         return titleRow;  
  180.     }  
  181.   
  182.     public void setTitleRow(int titleRow) {  
  183.         this.titleRow = titleRow;  
  184.     }  
  185. }  



20003格式:

  1. package com.gaosheng.util.xls;  
  2. import java.io.FileInputStream;  
  3. import java.io.FileNotFoundException;  
  4. import java.io.IOException;  
  5. import java.io.PrintStream;  
  6. import java.sql.SQLException;  
  7. import java.util.ArrayList;  
  8. import java.util.List;  
  9.   
  10. import org.apache.poi.hssf.eventusermodel.FormatTrackingHSSFListener;  
  11. import org.apache.poi.hssf.eventusermodel.HSSFEventFactory;  
  12. import org.apache.poi.hssf.eventusermodel.HSSFListener;  
  13. import org.apache.poi.hssf.eventusermodel.HSSFRequest;  
  14. import org.apache.poi.hssf.eventusermodel.MissingRecordAwareHSSFListener;  
  15. import org.apache.poi.hssf.eventusermodel.EventWorkbookBuilder.SheetRecordCollectingListener;  
  16. import org.apache.poi.hssf.eventusermodel.dummyrecord.LastCellOfRowDummyRecord;  
  17. import org.apache.poi.hssf.eventusermodel.dummyrecord.MissingCellDummyRecord;  
  18. import org.apache.poi.hssf.model.HSSFFormulaParser;  
  19. import org.apache.poi.hssf.record.BOFRecord;  
  20. import org.apache.poi.hssf.record.BlankRecord;  
  21. import org.apache.poi.hssf.record.BoolErrRecord;  
  22. import org.apache.poi.hssf.record.BoundSheetRecord;  
  23. import org.apache.poi.hssf.record.FormulaRecord;  
  24. import org.apache.poi.hssf.record.LabelRecord;  
  25. import org.apache.poi.hssf.record.LabelSSTRecord;  
  26. import org.apache.poi.hssf.record.NoteRecord;  
  27. import org.apache.poi.hssf.record.NumberRecord;  
  28. import org.apache.poi.hssf.record.RKRecord;  
  29. import org.apache.poi.hssf.record.Record;  
  30. import org.apache.poi.hssf.record.SSTRecord;  
  31. import org.apache.poi.hssf.record.StringRecord;  
  32. import org.apache.poi.hssf.usermodel.HSSFWorkbook;  
  33. import org.apache.poi.poifs.filesystem.POIFSFileSystem;  
  34.   
  35. public abstract class HxlsAbstract implements HSSFListener {  
  36.     private int minColumns;  
  37.     private POIFSFileSystem fs;  
  38.     private PrintStream output;  
  39.   
  40.     private int lastRowNumber;  
  41.     private int lastColumnNumber;  
  42.   
  43.     /** Should we output the formula, or the value it has? */  
  44.     private boolean outputFormulaValues = true;  
  45.   
  46.     /** For parsing Formulas */  
  47.     private SheetRecordCollectingListener workbookBuildingListener;  
  48.     private HSSFWorkbook stubWorkbook;  
  49.   
  50.     // Records we pick up as we process  
  51.     private SSTRecord sstRecord;  
  52.     private FormatTrackingHSSFListener formatListener;  
  53.   
  54.     /** So we known which sheet we're on */  
  55.     private int sheetIndex = -1;  
  56.     private BoundSheetRecord[] orderedBSRs;  
  57.     @SuppressWarnings("unchecked")  
  58.     private ArrayList boundSheetRecords = new ArrayList();  
  59.   
  60.     // For handling formulas with string results  
  61.     private int nextRow;  
  62.     private int nextColumn;  
  63.     private boolean outputNextStringRecord;  
  64.   
  65.     private int curRow;  
  66.     private List<String> rowlist;  
  67.     @SuppressWarnings"unused")  
  68.     private String sheetName;  
  69.   
  70.     public HxlsAbstract(POIFSFileSystem fs)  
  71.             throws SQLException {  
  72.         this.fs = fs;  
  73.         this.output = System.out;  
  74.         this.minColumns = -1;  
  75.         this.curRow = 0;  
  76.         this.rowlist = new ArrayList<String>();  
  77.     }  
  78.   
  79.     public HxlsAbstract(String filename) throws IOException,  
  80.             FileNotFoundException, SQLException {  
  81.         this(new POIFSFileSystem(new FileInputStream(filename)));  
  82.     }  
  83.       
  84.     //excel记录行操作方法,以行索引和行元素列表为参数,对一行元素进行操作,元素为String类型  
  85. //  public abstract void optRows(int curRow, List<String> rowlist) throws SQLException ;  
  86.       
  87.     //excel记录行操作方法,以sheet索引,行索引和行元素列表为参数,对sheet的一行元素进行操作,元素为String类型  
  88.     public abstract void optRows(int sheetIndex,int curRow, List<String> rowlist) throws SQLException;  
  89.       
  90.     /** 
  91.      * 遍历 excel 文件 
  92.      */  
  93.     public void process() throws IOException {  
  94.         MissingRecordAwareHSSFListener listener = new MissingRecordAwareHSSFListener(  
  95.                 this);  
  96.         formatListener = new FormatTrackingHSSFListener(listener);  
  97.   
  98.         HSSFEventFactory factory = new HSSFEventFactory();  
  99.         HSSFRequest request = new HSSFRequest();  
  100.   
  101.         if (outputFormulaValues) {  
  102.             request.addListenerForAllRecords(formatListener);  
  103.         } else {  
  104.             workbookBuildingListener = new SheetRecordCollectingListener(  
  105.                     formatListener);  
  106.             request.addListenerForAllRecords(workbookBuildingListener);  
  107.         }  
  108.   
  109.         factory.processWorkbookEvents(request, fs);  
  110.     }  
  111.       
  112.     /** 
  113.      * HSSFListener 监听方法,处理 Record 
  114.      */  
  115.     @SuppressWarnings("unchecked")  
  116.     public void processRecord(Record record) {  
  117.         int thisRow = -1;  
  118.         int thisColumn = -1;  
  119.         String thisStr = null;  
  120.         String value = null;  
  121.           
  122.         switch (record.getSid()) {  
  123.         case BoundSheetRecord.sid:  
  124.             boundSheetRecords.add(record);  
  125.             break;  
  126.         case BOFRecord.sid:  
  127.             BOFRecord br = (BOFRecord) record;  
  128.             if (br.getType() == BOFRecord.TYPE_WORKSHEET) {  
  129.                 // Create sub workbook if required  
  130.                 if (workbookBuildingListener != null && stubWorkbook == null) {  
  131.                     stubWorkbook = workbookBuildingListener  
  132.                             .getStubHSSFWorkbook();  
  133.                 }  
  134.   
  135.                 // Works by ordering the BSRs by the location of  
  136.                 // their BOFRecords, and then knowing that we  
  137.                 // process BOFRecords in byte offset order  
  138.                 sheetIndex++;  
  139.                 if (orderedBSRs == null) {  
  140.                     orderedBSRs = BoundSheetRecord  
  141.                             .orderByBofPosition(boundSheetRecords);  
  142.                 }  
  143.                 sheetName = orderedBSRs[sheetIndex].getSheetname();  
  144.             }  
  145.             break;  
  146.   
  147.         case SSTRecord.sid:  
  148.             sstRecord = (SSTRecord) record;  
  149.             break;  
  150.   
  151.         case BlankRecord.sid:  
  152.             BlankRecord brec = (BlankRecord) record;  
  153.   
  154.             thisRow = brec.getRow();  
  155.             thisColumn = brec.getColumn();  
  156.             thisStr = "";  
  157.             break;  
  158.         case BoolErrRecord.sid:  
  159.             BoolErrRecord berec = (BoolErrRecord) record;  
  160.   
  161.             thisRow = berec.getRow();  
  162.             thisColumn = berec.getColumn();  
  163.             thisStr = "";  
  164.             break;  
  165.   
  166.         case FormulaRecord.sid:  
  167.             FormulaRecord frec = (FormulaRecord) record;  
  168.   
  169.             thisRow = frec.getRow();  
  170.             thisColumn = frec.getColumn();  
  171.   
  172.             if (outputFormulaValues) {  
  173.                 if (Double.isNaN(frec.getValue())) {  
  174.                     // Formula result is a string  
  175.                     // This is stored in the next record  
  176.                     outputNextStringRecord = true;  
  177.                     nextRow = frec.getRow();  
  178.                     nextColumn = frec.getColumn();  
  179.                 } else {  
  180.                     thisStr = formatListener.formatNumberDateCell(frec);  
  181.                 }  
  182.             } else {  
  183.                 thisStr = '"' + HSSFFormulaParser.toFormulaString(stubWorkbook,  
  184.                         frec.getParsedExpression()) + '"';  
  185.             }  
  186.             break;  
  187.         case StringRecord.sid:  
  188.             if (outputNextStringRecord) {  
  189.                 // String for formula  
  190.                 StringRecord srec = (StringRecord) record;  
  191.                 thisStr = srec.getString();  
  192.                 thisRow = nextRow;  
  193.                 thisColumn = nextColumn;  
  194.                 outputNextStringRecord = false;  
  195.             }  
  196.             break;  
  197.   
  198.         case LabelRecord.sid:  
  199.             LabelRecord lrec = (LabelRecord) record;  
  200.   
  201.             curRow = thisRow = lrec.getRow();  
  202.             thisColumn = lrec.getColumn();  
  203.             value = lrec.getValue().trim();  
  204.             value = value.equals("")?" ":value;  
  205.             this.rowlist.add(thisColumn, value);  
  206.             break;  
  207.         case LabelSSTRecord.sid:  
  208.             LabelSSTRecord lsrec = (LabelSSTRecord) record;  
  209.   
  210.             curRow = thisRow = lsrec.getRow();  
  211.             thisColumn = lsrec.getColumn();  
  212.             if (sstRecord == null) {  
  213.                 rowlist.add(thisColumn, " ");  
  214.             } else {  
  215.                 value =  sstRecord  
  216.                 .getString(lsrec.getSSTIndex()).toString().trim();  
  217.                 value = value.equals("")?" ":value;  
  218.                 rowlist.add(thisColumn,value);  
  219.             }  
  220.             break;  
  221.         case NoteRecord.sid:  
  222.             NoteRecord nrec = (NoteRecord) record;  
  223.   
  224.             thisRow = nrec.getRow();  
  225.             thisColumn = nrec.getColumn();  
  226.             // TODO: Find object to match nrec.getShapeId()  
  227.             thisStr = '"' + "(TODO)" + '"';  
  228.             break;  
  229.         case NumberRecord.sid:  
  230.             NumberRecord numrec = (NumberRecord) record;  
  231.   
  232.             curRow = thisRow = numrec.getRow();  
  233.             thisColumn = numrec.getColumn();  
  234.             value = formatListener.formatNumberDateCell(numrec).trim();  
  235.             value = value.equals("")?" ":value;  
  236.             // Format  
  237.             rowlist.add(thisColumn, value);  
  238.             break;  
  239.         case RKRecord.sid:  
  240.             RKRecord rkrec = (RKRecord) record;  
  241.   
  242.             thisRow = rkrec.getRow();  
  243.             thisColumn = rkrec.getColumn();  
  244.             thisStr = '"' + "(TODO)" + '"';  
  245.             break;  
  246.         default:  
  247.             break;  
  248.         }  
  249.   
  250.         // 遇到新行的操作  
  251.         if (thisRow != -1 && thisRow != lastRowNumber) {  
  252.             lastColumnNumber = -1;  
  253.         }  
  254.   
  255.         // 空值的操作  
  256.         if (record instanceof MissingCellDummyRecord) {  
  257.             MissingCellDummyRecord mc = (MissingCellDummyRecord) record;  
  258.             curRow = thisRow = mc.getRow();  
  259.             thisColumn = mc.getColumn();  
  260.             rowlist.add(thisColumn," ");  
  261.         }  
  262.   
  263.         // 如果遇到能打印的东西,在这里打印  
  264.         if (thisStr != null) {  
  265.             if (thisColumn > 0) {  
  266.                 output.print(',');  
  267.             }  
  268.             output.print(thisStr);  
  269.         }  
  270.   
  271.         // 更新行和列的值  
  272.         if (thisRow > -1)  
  273.             lastRowNumber = thisRow;  
  274.         if (thisColumn > -1)  
  275.             lastColumnNumber = thisColumn;  
  276.   
  277.         // 行结束时的操作  
  278.         if (record instanceof LastCellOfRowDummyRecord) {  
  279.             if (minColumns > 0) {  
  280.                 // 列值重新置空  
  281.                 if (lastColumnNumber == -1) {  
  282.                     lastColumnNumber = 0;  
  283.                 }  
  284.             }  
  285.             // 行结束时, 调用 optRows() 方法  
  286.             lastColumnNumber = -1;  
  287.             try {  
  288.                 optRows(sheetIndex,curRow, rowlist);  
  289.             } catch (SQLException e) {  
  290.                 e.printStackTrace();  
  291.             }  
  292.             rowlist.clear();  
  293.         }  
  294.     }  
  295. }  


###########大数据导出导出时采用SXSSFWorkbook处理大数据###################
/**创建空模板 利用SXSSF技术,降低内存使用率**/

Workbook wb =  new SXSSFWorkbook(1000);
Sheet sheet = wb.createSheet();

spring在上传excel文件时,有时候会有缓存,即上传的excel解析后会有重复,所有contrllor层时,一定要使用注解@scoper='prototype"

2015-05-14 14:40:08 tracytingting 阅读数 18
  • 基于SSM的POI导入导出Excel实战

    本课程将给大家分享如何基于SSM实现POI导入导出Excel,并讲解目前企业级JavaWeb应用mvc三层模式的开发流程,可让初学者或者职场萌新掌握如何基于SSM整合第三方框架并采用mvc三层开发模式实现自己的业务模块!

    1269 人正在学习 去看看 钟林森

从数据库中读取数据并导出excel文件(要求excel2007版本)

xssfworkbook用于excel2007版本

 

 

service.java

	public Object invoke(Object inData) throws TonicareException {
		// TODO Auto-generated method stub
		WarehouseWasteRecordListVo vo=(WarehouseWasteRecordListVo) inData;
		
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		String path = "";
	
		if(StringUtils.isNotEmpty(vo.getOpType())){
			if(Const.OPERATE_VIEW.equals(vo.getOpType())){
				
				String opid[]=vo.getOpId().split(",");
				vo.setOpId(opid[0]);//传值过来的id可能会将id重复 变成“31,31”这种形式
				DeliverDao dao=(DeliverDao) BeanFactory.getDao(Const.DAO_MGMT_DELIVER);
				WhWareHouse house=dao.getWarehouseById(Integer.parseInt(vo.getOpId()));
				
				String name =house.getName()+"—仓库废品处理记录"+System.currentTimeMillis();
				vo.setFileName(name);

 				path = this.WriteExcel(vo,conn,ps,rs);
				if (StringUtils.isNotEmpty(path))
					vo.setCsv(path);
			}				
		}
		return null;
	}
	

 

 

 

	public String WriteExcel(WarehouseWasteRecordListVo vo,Connection conn ,PreparedStatement ps,ResultSet rs ){
		String result=StringUtils.EMPTY;
		Date tmp=null;
		try {
			conn=DbHelper.getConnection();
			if(id>0){
				String strSql = "select  a.*,b.name,b.PRICE_QUOTE,b.BASE_ID,b.BASE_AMOUNT,b.TYPE_ID  from wh_order_waste a ,wh_product b  where 1=1  and a.PRODUCT_ID=b.CODE and a.WAREHOUSE_ID="+id;
				
				ps=conn.prepareStatement(strSql);
				rs=ps.executeQuery();
				while(rs.next()){
					WarehouseWasteRecordEditVo row=new WarehouseWasteRecordEditVo();
					row.setId(rs.getInt("id"));
					row.setWarehouseId(rs.getInt("warehouse_id"));
					row.setName(rs.getString("name"));
					row.setProductId(rs.getLong("product_id"));
					row.setAmount(rs.getInt("amount"));
					row.setFlag(rs.getInt("flag"));
					
					Integer typeid=rs.getInt("TYPE_ID");
					if(typeid!=null && typeid!=0){
						StProductTypeDao daotype= (StProductTypeDao) BeanFactory.getDao(Const.DAO_SELL_STPRODUCTTYPE);
						StProductType productType=daotype.getProductTypeById(typeid);
						row.setTypeName(productType.getName());
					}else{
						row.setTypeName("");
					}
					
					Long baseid=rs.getLong("BASE_ID");
					if(baseid!=null && baseid!=0){
						DeliverDao dao=(DeliverDao) BeanFactory.getDao(Const.DAO_MGMT_DELIVER);
						WhProduct pro=dao.getProductByCode(baseid).get(0);
						row.setSumPrice(row.getAmount()*pro.getPriceQuote());
					}else{
						row.setSumPrice(0.0);
					}
					
					tmp = new Date(rs.getTimestamp("UPDATE_TIME").getTime());
					row.setUpdateTime(tmp);
					vo.getDatas().add(row);
				}
			}
			
			result=Config.APP_PATH+File.separator+"report"+File.separator+vo.getFileName()+".xlsx";
			FileOutputStream fos=new FileOutputStream(result);
			XSSFWorkbook xfwb=new XSSFWorkbook();// 创建工作薄
			
			XSSFSheet sheet=xfwb.createSheet("sheet1");// 在工作薄中创建一工作表
			XSSFRow row=sheet.createRow(0);// 在指定的索引处创建一行
			row.createCell(0).setCellValue(vo.getFileName());
			
			XSSFRow row1=sheet.createRow(1);
			row1.createCell(0).setCellValue("序号");
			row1.createCell(1).setCellValue("产品条码");
			row1.createCell(2).setCellValue("产品名称");
			row1.createCell(3).setCellValue("分类");
			row1.createCell(4).setCellValue("废品处理数量(瓶)");
			row1.createCell(5).setCellValue("金额");
			row1.createCell(6).setCellValue("责任方");
			row1.createCell(7).setCellValue("时间");
			
			if(vo.getDatas()!=null && vo.getDatas().size()>0){
				for(int i = 0; i < vo.getDatas().size(); i++){
					WarehouseWasteRecordEditVo  bean=vo.getDatas().get(i);
					XSSFRow dataRow=sheet.createRow(i+2);
					
					dataRow.createCell(0).setCellValue((i+1));
					dataRow.createCell(1).setCellValue(String.valueOf(bean.getProductId()));//将产品id强制转换成字符串类型,避免excel报表出现不科学计算
					dataRow.createCell(2).setCellValue(bean.getName());
					dataRow.createCell(3).setCellValue(bean.getTypeName());
					dataRow.createCell(4).setCellValue(bean.getAmount());
					dataRow.createCell(5).setCellValue(bean.getSumPrice());
					
					String responsible=null;
					if(bean.getFlag()!=null){
						//1:公司废弃;2:供应商;3:物流赔付;
						if(bean.getFlag()==1){
							responsible="公司废弃";
						}else if(bean.getFlag()==2){
							responsible="供应商";
						}else if(bean.getFlag()==3){
							responsible="物流赔付";
						}
					}
					dataRow.createCell(6).setCellValue(responsible);
					
					SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
					dataRow.createCell(7).setCellValue(sdf.format(bean.getUpdateTime()));
                                         //从数据库查询得到的时间已经转换为data形式  excel报表需要“yyyy-MM-dd hh:mm:ss”形式的数据 
				}
			}
			xfwb.write(fos);
			fos.flush();
			fos.close();
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
			LogHelper.error(e);
		}finally{
			DbHelper.closedAll(rs, ps, conn);
		}
		
		return result;
	}

 

 action.java

 

		if (StringUtils.isNotEmpty(vo.getCsv())) {
			try {
				HttpServletResponse response = ServletActionContext.getResponse();
				response.setContentType("application/force-download");
				response.setCharacterEncoding(Const.DEFAULT_CHARSET);
				response.setHeader("Content-Disposition", "attachment;filename=" +java.net.URLEncoder.encode(vo.getFileName(), "UTF-8") + ".xlsx");
				
				OutputStream os = null;
				FileInputStream fis = null;
				
				os = response.getOutputStream();
				fis = new FileInputStream(vo.getCsv());
				byte[] b = new byte[1024];
				int i = 0;
				while((i=fis.read(b)) > 0)
					os.write(b, 0, i);
				os.flush();
				os.close();
				fis.close();
				fis = null;
			}
			catch (Exception e) {
				LogHelper.info("");
			}
			return null;
		}

 

 

页面代码

 

<div>
		<ul class="toolBar">
			<li><a class="icon" href="deliver/warehouseWasteRecordList.do?opId=${opId}&opType=VIEW"  target="dwzExport"  targetType="navTab" id="exportProduct" postType="string" title="确定要导出这些记录吗?" ><span>导出废品处理记录</span></a></li>
		</ul>
	</div>

 

 

没有更多推荐了,返回首页