JAVA利用POI导出Excel表格,附一个最简单的例子

    说白了,就是查出数据然后塞到Excel中就OK了,感觉没什么理论要说,下面以我做的例子来说一下。我用的项目后台分为两块,一个前台controller,一个后台controller,我这里的处理是web端条件传给前台controller,这些条件传给后台controller,后台连接数据库进行查询,之后把数据封装进map返回给前台controller,前台负责把它塞到Excel中。如果各位只有一个controller,也是一样,就是少了一层而已。

    web代码,没什么好说的,导出的按钮事件中直接写这两句就好:

    var url = encodeURI(encodeURI(后台接口地址));

    window.location.href = url;

    数据的查询以及两个服务器之间的传递也是so easy,我就直接从取得数据后开始说了:

    我是新建了一个工具类ViewExcel,数据都传进这个类里进行处理   

    controller中的接口

    @RequestMapping(value = "/ledgerExport.do")
    @ResponseBody
    public ModelAndView ledgerExport(String conditionJson) {
        String tablename=request.getParameter("tablename");
        String projectId=request.getParameter("projectId");
        String groupId=request.getParameter("groupId");
        String startDate = request.getParameter("startDate")==null?"":request.getParameter("startDate");
        String endDate = request.getParameter("endDate")==null?"":request.getParameter("endDate");
        //后台查询出list之后封装到map里,再装到json里传过来
        String result = HttpTookit.doGet(Constants.DOMAIN+"blog/ledgerExport.do?tablename="+tablename+"&projectId="+projectId+"&groupId="+groupId+"&startDate="+startDate+"&endDate="+endDate,"","");
        //转化成map
        Map<String, Object> map = (Map<String, Object>)JSON.parse(result);
        
        return new ModelAndView(new ViewExcel(), map);
    }

    前面都是数据的获取和传递,倒数第二句是直接把数据装到map中,因为本来的返回值就是map所以直接用就好了。

    下面是工具类的代码,删除了很多样式之后的样子:

package cn.rails.pms.core.controller.system;

import java.beans.PropertyDescriptor;
import java.io.OutputStream;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.net.URLDecoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.CellStyle;
import org.springframework.web.servlet.view.document.AbstractExcelView;

import com.alibaba.fastjson.JSONArray;



public class ViewExcel extends AbstractExcelView{
    @SuppressWarnings({ "unchecked", "deprecation" })
    @Override
    protected void buildExcelDocument(Map<String, Object> model,
            HSSFWorkbook workbook, HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        // TODO Auto-generated method stub

        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        String fileName = "台账信息导出" + df.format(new Date()) + ".xls";//文件名

        response.setCharacterEncoding("UTF-8");//编码
        response.setContentType("application/ms-excel");
        response.setHeader("Content-Disposition", "inline; filename="
                + new String(fileName.getBytes(), "iso8859-1"));
        OutputStream outputStream = response.getOutputStream();
        
        //设置字体样式
        HSSFFont font = workbook.createFont();
        font.setFontName("黑体");
        font.setFontHeightInPoints((short) 12);//设置字体大小
        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//粗体显示
        
        //标题单元格样式,暂时只有居中这一个属性
        HSSFCellStyle cellStyleTitle = workbook.createCellStyle();
        cellStyleTitle.setAlignment(HSSFCellStyle.ALIGN_CENTER);//横向居中
        cellStyleTitle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//纵向居中
        cellStyleTitle.setFont(font);//应用上面设置的字体样式


        
        //设备报验台账
        List sbby = (List) model.get("sbby");
        if(sbby!=null){
            // 产生Excel表头
            String sheetName = "设备报验台账";
            HSSFSheet sheet = workbook.createSheet(sheetName);
            /*sheet.setColumnWidth(0, 6000);  
            sheet.setColumnWidth(1, 6000);
            sheet.setColumnWidth(2, 6000);
            sheet.setColumnWidth(3, 6000);
            sheet.setColumnWidth(4, 6000);*/

            
            
            HSSFRow header = sheet.createRow(0);
            //设置标题列行高
            header.setHeight((short) 500);
            // 产生标题列
            String[] headers = { "设备名称", "规格型号", "生产厂家", "验收结论", "使用场区"};
            for (int i = 0; i < headers.length; i++) {
                HSSFCell cell = header.createCell(i);
                cell.setCellValue(headers[i]);
                cell.setCellStyle(cellStyleTitle);
                //设置列宽
                sheet.setColumnWidth(i, 6000);//这里是借用这个i而已,作用等同于上面的注释部分
            }

            int rowNumber = 1;
            if(sbby.size()>0){
                for (int x=0; x<sbby.size(); x++) {
                    HSSFRow row = sheet.createRow(rowNumber++);
                    JSONArray cells = (JSONArray) sbby.get(x);
                    for (int y=0; y < cells.size(); y++) {
                        Object value = cells.get(y);
                        HSSFCell cell = row.createCell(y);
                        if (value == null) {

                        } else {
                            if(value instanceof Integer){
                                cell.setCellValue((Integer)value);
                            }else if(value instanceof Date){
                                cell.setCellValue((Double)value);
                            }else if(value instanceof Date){
                                SimpleDateFormat dateFm = new SimpleDateFormat("yyyy-MM-dd");
                                cell.setCellValue( dateFm.format(value));
                            }else if(value instanceof String){
                                cell.setCellValue((String)value);
                            }
                        }
                        //把Excel中的单元格都设置为文本格式
                        cell.setCellType(HSSFCell.CELL_TYPE_STRING);
                    }
                }
            }
        }
        workbook.write(outputStream);
        outputStream.flush();
        outputStream.close();
    }

}


    因为实在是太简单了,都不知道怎么展开说,实在是个简单的不能再简单的例子,

    1.先建一个工作簿,也就是excel文件    HSSFWorkbook workbook

    2.在这个工作簿中建一个sheet页    HSSFSheet sheet = workbook.createSheet("sheet页名称");

    3.建一个标题行    HSSFRow header = sheet.createRow(0);    

    4.在这一行建立单元格     HSSFCell cell = header.createCell(i);

    5.单元格赋值和设置样式    cell.setCellValue(headers[i]);    cell.setCellStyle(cellStyleTitle);    

    6.注意这里的样式不是直接设置的,而是在之前设置好一个样式,然后把它赋给单元格

    HSSFCellStyle cellStyleTitle = workbook.createCellStyle();

    7.循环建立行,往里面插入查询到的列表的数据    HSSFRow row = sheet.createRow(rowNumber++);

    8.循环行的数据赋值也是一样的

    9.然后就是固定的导出文件操作

        workbook.write(outputStream);
        outputStream.flush();
        outputStream.close();

    10.一个最最简单的导出就完成了!

    其实java中的很多东西都可以通过点点出来,也就是Alt+/,之后看看这些属性的名字也能知道个大概功能,设置样式什么的,比如文字水平居中,垂直居中,边框,还有字体的颜色,大小,下划线,加粗,倾斜什么的,都不是什么麻烦事,真正麻烦的只有刚开始接触,无处下口的感觉,希望这篇文章能帮助到大家。







  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是利用POI导出Excel表格的步骤: 1.导入POI的jar包。 在Java工程中,需要将POI的jar包添加到工程中。 2.创建工作簿(Workbook)和工作表(Sheet)对象。 使用POI创建Excel表格的第一步是创建工作簿和工作表对象。 3.创建表头。 在Excel表格中,表头通常是第一行,我们需要将表头信息写入到该行中。 4.写入数据。 利用Java代码将需要导出的数据写入到Excel表格中。 5.设置单元格样式。 可以通过设置单元格样式来美化Excel表格。 6.保存Excel表格。 最后,将Excel表格保存到指定的位置。 下面是一个示例代码: ``` // 创建工作簿 Workbook wb = new HSSFWorkbook(); // 创建工作表 Sheet sheet = wb.createSheet("Sheet1"); // 创建表头 Row row = sheet.createRow(0); Cell cell = row.createCell(0); cell.setCellValue("姓名"); cell = row.createCell(1); cell.setCellValue("年龄"); // 写入数据 List<User> userList = getUserList(); for(int i = 0; i < userList.size(); i++){ User user = userList.get(i); row = sheet.createRow(i + 1); cell = row.createCell(0); cell.setCellValue(user.getName()); cell = row.createCell(1); cell.setCellValue(user.getAge()); } // 设置单元格样式 CellStyle style = wb.createCellStyle(); style.setAlignment(HorizontalAlignment.CENTER); cell.setCellStyle(style); // 保存Excel表格 FileOutputStream fos = new FileOutputStream("user.xlsx"); wb.write(fos); fos.close(); ``` 以上是一个简单POI导出Excel表格的示例代码,你可以根据具体需求进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值