struts jxl导出Excel

struts2配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
        <package name="vclassenroll" extends="json-default" namespace="/vclassenroll">
            <action name="op/*" class="com.xxx.action.VclassEnrollOperateAction" method="{1}">
                <result name="excel" type="stream">
                <param name="contentType">
                    application/vnd.ms-excel
                </param>
                <param name="inputName">excelStream</param>
                <param name="contentDisposition">
                   filename="${fileName}.xls"
                </param>
                <param name="bufferSize">1024</param>
            </result>
            </action>
        </package>
</struts>

struts2对应的action

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Random;
import javax.annotation.Resource;

public class VclassEnrollOperateAction extends BaseAction {
    private static final long serialVersionUID = -941593970307742358L;
    @Resource
    private VclassEnrollService vclassEnrollService;
    private VclassEnroll vclassEnroll;
    private String classId;
    private InputStream excelStream;
    private String fileName;

    public String exportExcel() {
        if(vclassEnroll == null){
            vclassEnroll = new VclassEnroll();
        }
        if(StringUtils.isNotNull(classId)){
            vclassEnroll.setVclass_id(Integer.parseInt(classId));
            List<VclassEnroll> list = vclassEnrollService.getList(vclassEnroll);
            // 将OutputStream转化为InputStream
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            List<String> columns = new ArrayList<String>();
            columns.add("序号");
            columns.add("姓名");
            columns.add("年级");
            columns.add("班级");
            columns.add("电话");
            String cname ="";
            if(list != null && list.size() > 0){
                cname = list.get(0).getCname();
            }

            JxlExcelUtils.getExcelStream(out, list, "报名记录-"+cname, columns);
            excelStream =  new ByteArrayInputStream(out.toByteArray());
            fileName = createFileName();
        }
        return "excel";

    }

     /**
     * 以年月日时分秒毫秒+4位随机数的格式来创建一个文件名,不带扩展名
     * @return 文件名
     */
    public static String createFileName() {
        StringBuffer sb = new StringBuffer();
        Date date = new Date();
        //获取年月日时分秒
        sb.append(new SimpleDateFormat("yyyyMMddHHmmss").format(date));
        //毫秒
        String milli = String.valueOf(date.getTime() % 1000);
        while (milli.length() < 3) {
            milli = "0" + milli;
        }
        sb.append(milli);
        //四位随机数
        String rondom = String.valueOf(new Random().nextInt(10000));
        while (rondom.length() < 4) {
            rondom = "0" + rondom;
        }
        sb.append(rondom);
        return sb.toString();
    }  

}

工具类

import java.io.ByteArrayOutputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import jxl.SheetSettings;
import jxl.Workbook;
import jxl.format.Alignment;
import jxl.format.Colour;
import jxl.format.VerticalAlignment;
import jxl.write.Label;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
public class JxlExcelUtils {

    /**
     * @author
     * @param objData 导出内容数组
     * @param sheetName 导出工作表的名称
     * @param columns 导出Excel的表头数组
     * @return
     */
    public static int getExcelStream(ByteArrayOutputStream os, List<VclassEnroll> list, String sheetName,List<String> columns) {
        int flag = 0;
        //声明工作簿jxl.write.WritableWorkbook
        WritableWorkbook workbook;
        try {
            //根据传进来的file对象创建可写入的Excel工作薄  

            workbook = Workbook.createWorkbook(os);  

            /*
             * 创建一个工作表、sheetName为工作表的名称、"0"为第一个工作表
             * 打开Excel的时候会看到左下角默认有3个sheet、"sheet1、sheet2、sheet3"这样
             * 代码中的"0"就是sheet1、其它的一一对应。
             * createSheet(sheetName, 0)一个是工作表的名称,另一个是工作表在工作薄中的位置
             */
            WritableSheet ws = workbook.createSheet(sheetName, 0);  

            SheetSettings ss = ws.getSettings();
            ss.setVerticalFreeze(1);//冻结表头  

            WritableFont font1 =new WritableFont(WritableFont.createFont("微软雅黑"), 10 ,WritableFont.BOLD);
            WritableFont font2 =new WritableFont(WritableFont.createFont("微软雅黑"), 9 ,WritableFont.NO_BOLD);
            WritableCellFormat wcf = new WritableCellFormat(font1);
            WritableCellFormat wcf2 = new WritableCellFormat(font2);
            WritableCellFormat wcf3 = new WritableCellFormat(font2);//设置样式,字体  

            //创建单元格样式
            //WritableCellFormat wcf = new WritableCellFormat();  

            //背景颜色
            wcf.setBackground(jxl.format.Colour.YELLOW);
            wcf.setAlignment(Alignment.CENTRE);  //平行居中
            wcf.setVerticalAlignment(VerticalAlignment.CENTRE);  //垂直居中
            wcf3.setAlignment(Alignment.CENTRE);  //平行居中
            wcf3.setVerticalAlignment(VerticalAlignment.CENTRE);  //垂直居中
            wcf3.setBackground(Colour.LIGHT_ORANGE);
            wcf2.setAlignment(Alignment.CENTRE);  //平行居中
            wcf2.setVerticalAlignment(VerticalAlignment.CENTRE);  //垂直居中  

            /*
             * 这个是单元格内容居中显示
             * 还有很多很多样式
             */
            wcf.setAlignment(Alignment.CENTRE);  

            //判断一下表头数组是否有数据
            if (columns != null && columns.size() > 0) {  

                //循环写入表头
                for (int i = 0; i < columns.size(); i++) {  

                    /*
                     * 添加单元格(Cell)内容addCell()
                     * 添加Label对象Label()
                     * 数据的类型有很多种、在这里你需要什么类型就导入什么类型
                     * 如:jxl.write.DateTime 、jxl.write.Number、jxl.write.Label
                     * Label(i, 0, columns[i], wcf)
                     * 其中i为列、0为行、columns[i]为数据、wcf为样式
                     * 合起来就是说将columns[i]添加到第一行(行、列下标都是从0开始)第i列、样式为什么"色"内容居中
                     */
                    ws.addCell(new Label(i, 0, columns.get(i), wcf));
                }  

                //判断表中是否有数据
                if (list != null && list.size() > 0) {
                    //循环写入表中数据
                    for (int i = 0; i < list.size(); i++) {
                        int j = i+1;
                        ws.addCell(new Label(0, j, i+""));
                        ws.addCell(new Label(1, j, list.get(i).getStu_name()));
                        ws.addCell(new Label(2, j, list.get(i).getGradeid()+""));
                        ws.addCell(new Label(3, j, list.get(i).getClassid()+""));
                        ws.addCell(new Label(4, j, list.get(i).getTelephone()+""));
                    }
                }else{
                    flag = -1;
                }  

                //写入Exel工作表
                workbook.write();  

                //关闭Excel工作薄对象
                workbook.close();  

                //关闭流
                os.flush();
                os.close();  

                os =null;
            }
        }catch (IllegalStateException e) {
            System.err.println(e.getMessage());
        }
        catch (Exception ex) {
            flag = 0;
            ex.printStackTrace();
        }  

        return flag;
    }  

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-10 20:13:28

struts jxl导出Excel的相关文章

jxl导出Excel中需要跳过的的坑

正如上篇文章(JXL封装不能使用static关键字问题)所说,在jxl导出Excel时候如果频繁使用到WritableCellFormat去设置单元格的样式,这个时候经常会出现两种情况: 1.报警告:Warning:  Maximum number of format records exceeded.  Using default format.虽然说程序员一般不看警告,but这个警告讨厌了,他会把你超过限制的格式恢复成默认格式.所以必须解决. 2.报异常:java.lang.ArrayInd

用jxl导出Excel

断断续续,终于把这个简单的功能实现了. 本身花的有效时间也不多,但是陆续出现好多蛋疼的问题,归根结底是自己程序功底不深厚,尤其对Java流理解不透彻. 还好今天时间充足,磨得我背疼不已的时候,终于把它整完了. 这里首先介绍下背景:SSM框架(前端easyui).POI因为乱码问题被pass掉.五一假期又没有花时间,不得不赶紧换个API把他整出来. 功能大致是这样的: 点击按钮导出所有的(不经分页的)数据到Excel中. busiAccept.jsp 1 <%@ page language="

java中使用jxl导出Excel表格详细通用步骤

该方法一般接收两个参数,response和要导出的表格内容的list. 一般我们将数据库的数据查询出来在页面进行展示,根据用户需求,可能需要对页面数据进行导出. 此时只要将展示之前查询所得的数据放入session中备份一份,在调用导出方法时,从session中获取即可, 如果为后台直接导出,直接查询数据库后将结果传入即可,当然也可以在导出Excel方法中查询. 查询方法: // 获取查询结果存入session中        Object resultList = request.getAttr

jxl导出Excel文件

一.java项目实现读取Excel文件和导出Excel文件 实现读取和导出Excel文件的代码: package servlet; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.text.SimpleDateFormat;

JXL导出Excel工具类

将Excel中的数据读取到List<Map<String, Object>>集合中 package com.mvc.util; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Field;

用jxl导出excel报表

1.在项目中加入jxl.jar包 2.页面是一个from表单,也可以是一个a标签...,示例如下 1 <s:form action="claimVoucherStatistics_createDetailExcel.action" name="queryForm"> 2 <label for="time">年份:</label> 3 <s:property value="year"/&

Java中用JXL导出Excel代码详解

jxl是一个韩国人写的java操作excel的工具, 在开源世界中,有两套比较有影响的API可供使用,一个是POI,一个是jExcelAPI.其中功能相对POI比较弱一点.但jExcelAPI对中文支持非常好,API是纯Java的, 并不依赖Windows系统,即使运行在Linux下,它同样能够正确的处理Excel文件. 另外需要说明的是,这套API对图形和图表的支持很有限,而且仅仅识别PNG格式.使用如下:搭建环境 将下载后的文件解包,得到jxl.jar,放入classpath,安装就完成了.

jxl导出excel --- 居中 自动换行 边框 样式

public void writeToExl_GW(ByteArrayOutputStream byteOs)throws Exception{ try{ int timeLength = 0; ITrendService trendService = new TrendServiceImpl(); if(null != stepTime && !"".equals(stepTime)){ timeLength = Integer.valueOf(stepTime);

jxl导出EXCEL文件名称乱码

开始导出excle时名称是乱码的,加上下面的就可以了, String FileNam="xx医院_xxxx_xx_xx.xls"; res.setCharacterEncoding("UTF-8"); res.setContentType("application/octet-stream"); String fileName_1 = new String(FileName.getBytes("UTF-8"), "i