Java web项目利用POI导出excel

本文介绍了如何在Java Web项目中利用Apache POI库来创建并导出Excel文件,特别解决了在导出过程中中文名称显示的问题。
部署运行你感兴趣的模型镜像

今天做项目需要导出excel文件,采用POI生成excel结构。方式如下:(解决了中文名称下载问题

方式一:
import java.io.ByteArrayOutputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

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.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class ProcessExcelAction extends ActionSupport {

     public void export() {
          // 第一步,创建一个webbook,对应一个Excel文件
          HSSFWorkbook wb = new HSSFWorkbook();
          // 第二步,在webbook中添加一个sheet,对应Excel文件中的sheet
          HSSFSheet sheet = wb.createSheet("学生表一");
          // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short
          HSSFRow row = sheet.createRow((int) 0);
          // 第四步,创建单元格,并设置值表头 设置表头居中
          HSSFCellStyle style = wb.createCellStyle();
          style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 创建一个居中格式
          String fileName = "学生.xls";
          HttpServletResponse response = ServletActionContext.getResponse();
          this.setResponseHeader(response, fileName);
          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<Student> list = gainStudent();

          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 {
               OutputStream os = response.getOutputStream();
               wb.write(os);
               os.flush();
               os.close();
          } catch (Exception e) {
               e.printStackTrace();
          }
     }

     public void setResponseHeader(HttpServletResponse response, String fileName) {
          try {
               try {
                    fileName = new String(fileName.getBytes(),"ISO8859-1");
               } catch (UnsupportedEncodingException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
               }
               response
                         .setContentType("application/octet-stream;charset=ISO8859-1");
               response.setHeader("Content-Disposition", "attachment;filename="
                         + fileName);
               response.addHeader("Pargam", "no-cache");
               response.addHeader("Cache-Control", "no-cache");
          } catch (Exception ex) {
               ex.printStackTrace();
          }
     }

     private List<Student> gainStudent() {
          List<Student> list = new ArrayList<Student>();
          SimpleDateFormat df = new SimpleDateFormat("yyyy-mm-dd");
          try {
               Student user1 = new Student(1, "张三", 16, df.parse("1997-03-12"));
               Student user2 = new Student(2, "李四", 17, df.parse("1996-08-12"));
               Student user3 = new Student(3, "王五", 26, df.parse("1985-11-12"));
               list.add(user1);
               list.add(user2);
               list.add(user3);
          } catch (ParseException e) {
               // TODO Auto-generated catch block
               e.printStackTrace();
          }

          return list;
     }

}


方式二:
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import com.opensymphony.xwork2.ActionSupport;
import com.sun.xml.internal.messaging.saaj.util.ByteInputStream;
import com.sun.xml.internal.messaging.saaj.util.ByteOutputStream;
public class ProcessExcelAction1 extends ActionSupport {
       private String fileName = "学生.xls";
       private InputStream downloadStream ;
       public String export() {
             // 第一步,创建一个 webbook,对应一个Excel文件
            HSSFWorkbook wb = new HSSFWorkbook();
             // 第二步,在 webbook中添加一个sheet,对应Excel文件中的sheet
            HSSFSheet sheet = wb.createSheet( "学生表一" );
             // 第三步,在sheet中添加表头第0行,注意老版本 poi对Excel的行数列数有限制short
            HSSFRow row = sheet.createRow(( int ) 0);
             // 第四步,创建单元格,并设置值表头 设置表头居中
            HSSFCellStyle style = wb.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<Student> list = gainStudent();
             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 {
                  ByteOutputStream bos = new ByteOutputStream();
                  wb.write(bos);
                  bos.flush();
                   byte [] byteArray = bos.getBytes();
                   downloadStream = new ByteInputStream(byteArray, 0, byteArray.length );
                  bos.close();
            } catch (Exception e) {
                  e.printStackTrace();
            }
             return SUCCESS ;
      }
       private List<Student> gainStudent() {
            List<Student> list = new ArrayList<Student>();
            SimpleDateFormat df = new SimpleDateFormat("yyyy-mm-dd" );
             try {
                  Student user1 = new Student(1, "张三" , 16, df.parse("1997-03-12" ));
                  Student user2 = new Student(2, "李四" , 17, df.parse("1996-08-12" ));
                  Student user3 = new Student(3, "王五" , 26, df.parse("1985-11-12" ));
                  list.add(user1);
                  list.add(user2);
                  list.add(user3);
            } catch (ParseException e) {
                   // TODO Auto-generated catch block
                  e.printStackTrace();
            }
             return list;
      }
       public void setFileName(String fileName) {
             this .fileName = fileName;
      }
       public String getFileName() {
             try {
                   fileName = new String(fileName .getBytes(),"ISO8859-1" );
            } catch (UnsupportedEncodingException e) {
                   // TODO Auto-generated catch block
                  e.printStackTrace();
            }
             return fileName ;
      }
       public void setDownloadStream(InputStream downloadStream) {
             this .downloadStream = downloadStream;
      }
       public InputStream getDownloadStream() {
             return downloadStream ;
      }
}


struts2配置文件配置内容:
< result name ="success" type= "stream">
                         < param name ="contentType" > application/vnd.ms-excel</ param >
                         < param name ="contentDisposition" > attachment;filename=${fileName}</ param >
                         < param name ="bufferSize" > 1024</ param >
                         < param name ="inputName" > downloadStream</ param >
 </ result>



注意:以上红色字体为必须转换。若不转换会造成如下问题:
方式一:
     1.firefox可以正常下载,但是不能显示中文名称
     2.ie正常
方式二:
    1.firefox可以正常下载,但是不能显示中文名称
    2.ie下载报错
添加红色文本区域,两种方法均正常

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值