用jsp动态输出excel文档和中文乱码问题的解决

JSP动态输出Excel及中文乱码的解决 最近在网上看到一个用java来操纵excel的open source,在weblogic上试用了一下,觉得很不错,特此向大家推荐一下。   首先去http://www.andykhan.com/jexcelapi/index.html下载最新的JExcelApi,把jxl.jar置于你的classpath中。   写一个javaBean,利用JExcelApi来动态生成excel文档,我这里写一个最简单的,示意性的。复杂的你可能还要查询数据库什么的。 立即下载

用jsp动态输出excel文档和中文乱码问题的解决

作者:陈万飞

最近在网上看到一个用java来操纵excel的open source,在weblogic上试用了一下,觉得很不错,特此向大家推荐一下。

  1. 首先去http://www.andykhan.com/jexcelapi/index.html下载最新的JExcelApi,把jxl.jar置于你的classpath中。

  2. 写一个javaBean,利用JExcelApi来动态生成excel文档,我这里写一个最简单的,示意性的。复杂的你可能还要查询数据库什么的。
    ///////////////////////////Test.java///////////////////////////////////////////
    package com.jagie.test;
    import java.io.*;
    import jxl.*;
    import jxl.write.*;
    import jxl.format.*;
    
    
    import java.util.*;
    import java.awt.Color;
    public class Test{
    
    
      public static void writeExcel(OutputStream os) throws Exception {
        jxl.write.WritableWorkbook wwb = Workbook.createWorkbook(os);
        jxl.write.WritableSheet ws = wwb.createSheet("TestSheet1", 0);
        jxl.write.Label labelC = new jxl.write.Label(0, 0, "我爱中国");
        ws.addCell(labelC);
        jxl.write.WritableFont wfc = new jxl.write.WritableFont(WritableFont.ARIAL,
            20, WritableFont.BOLD, false,
            UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.GREEN);
        jxl.write.WritableCellFormat wcfFC = new jxl.write.WritableCellFormat(wfc);
        wcfFC.setBackground(jxl.format.Colour.RED);
        labelC = new jxl.write.Label(6, 0, "中国爱我",wcfFC);
        ws.addCell(labelC);
        //写入Exel工作表
        wwb.write();
        //关闭Excel工作薄对象
        wwb.close();
    
      }
    
    //最好写一个这样的main方法来测试一下你的这个class是否写好了。
      public static void main(String[] args)throws Exception{
        File f=new File("kk.xls");
        f.createNewFile();
        writeExcel(new FileOutputStream(f));
      }
    
    }
    
  3. 写一个jsp,来利用Test这个javabean输出excel文档。
    ///////////////////////////test_excel.jsp//////////////////////////
    
    <%@page import="com.jagie.test.Test" %>
    <%
    response.reset();
    response.setContentType("application/vnd.ms-excel");
    Test.writeExcel(response.getOutputStream());
    %>
    

这样就大功告成了,你用ie访问test_excel.jsp就能在ie里面打开动态生成的excel文档了。一点乱码也没有。

也许有人会问:response.reset();可不可以不要这一句,我的建议是一定要写,除非你能保证response的buffer里面没有别的东西。

还有人也许会问:我在jsp开头加上<%@page contentType="application/vnd.ms-excel;charset=GBK" %>这一句,去掉response.setContentType("application/vnd.ms-excel");行不行?回答这个问题很简单,就是查看jsp服务器编译jsp后生成的java代码,如果改成这样,我的welogic7编译test_excel.jsp后生成的java文件的示意性代码是这样的:

public void _jspService(javax.servlet.http.HttpServletRequest request, 
javax.servlet.http.HttpServletResponse response) throws java.io.IOException, 
javax.servlet.ServletException {  

        // declare and set well-known variables:
        javax.servlet.ServletConfig config = getServletConfig();
        javax.servlet.ServletContext application = config.getServletContext();
        javax.servlet.jsp.tagext.Tag _activeTag = null;
        // variables for Tag extension protocol

        Object page = this;
        javax.servlet.jsp.JspWriter out;
        javax.servlet.jsp.PageContext pageContext =
        javax.servlet.jsp.JspFactory.getDefaultFactory().getPageContext(this, 
          request, response, null, true, 8192, true);

        response.setHeader("Content-Type", 
          "application/vnd.ms-excel; charset=GBK");
        out = pageContext.getOut();
        JspWriter _originalOut = out;

        javax.servlet.http.HttpSession session = request.getSession(true);



        try { // error page try block

            response.setContentType("application/vnd.ms-excel;charset=GBK");

            out.print("/r/n/r/n/r/n/r/n");
            out.print("/r/n");
            //[ /test_excel.jsp; Line: 6]
            response.reset(); //[ /test_excel.jsp; Line: 7]
            //response.setContentType("application/vnd.ms-excel"); 
            //[ /test_excel.jsp; Line: 8]
            Test.writeExcel(response.getOutputStream()); //[ /test_excel.jsp; Line: 9]
        } catch (Throwable __ee) {
            while (out != null && out != _originalOut) out = pageContext.popBody();
            ((weblogic.servlet.jsp.PageContextImpl)pageContext).handlePageException((Throwable)__ee);
        }


        //before final close brace...
    }

很明显,屏蔽response.setContentType("application/vnd.ms-excel");后,在Test.writeExcel(response.getOutputStream());之前,response.reset(); 之后没有设置response contenttype的正确类型,当然输出为乱码了。而正确输出excel的jsp的编译后源码是这样的:

public void _jspService(javax.servlet.http.HttpServletRequest request, 
javax.servlet.http.HttpServletResponse response) throws java.io.IOException,
javax.servlet.ServletException 
    {  

        // declare and set well-known variables:
        javax.servlet.ServletConfig config = getServletConfig();
        javax.servlet.ServletContext application = config.getServletContext();
        javax.servlet.jsp.tagext.Tag _activeTag = null;
        // variables for Tag extension protocol

        Object page = this;
        javax.servlet.jsp.JspWriter out;
        javax.servlet.jsp.PageContext pageContext =
        javax.servlet.jsp.JspFactory.getDefaultFactory().getPageContext(
          this, request, response, null, true, 8192, true);

        out = pageContext.getOut();
        JspWriter _originalOut = out;

        javax.servlet.http.HttpSession session = request.getSession(true);



        try { // error page try block

            out.print("/r/n");
            //[ /test_excel.jsp; Line: 2]
            response.reset(); //[ /test_excel.jsp; Line: 3]
            response.setContentType("application/vnd.ms-excel"); //[ /test_excel.jsp; Line: 4]
            Test.writeExcel(response.getOutputStream()); //[ /test_excel.jsp; Line: 5]
        } catch (Throwable __ee) {
            while (out != null && out != _originalOut) out = pageContext.popBody();
            ((weblogic.servlet.jsp.PageContextImpl)pageContext).handlePageException((Throwable)__ee);
        }


        //before final close brace...
    }

大家可以看到在response.reset();之后,Test.writeExcel(response.getOutputStream());之前正确的设置了response的输出内容。所以输出就正常了。

最后,希望这篇文章能对你有所启发,如有错误之处,敬请批评指正!

参考资料

http://www.mail-archive.com/poi-user@jakarta.apache.org/msg02800.html

STGCN实战:从零构建PyTorch时空图卷积网络预测城市交通流 本文详细介绍了如何使用PyTorch从零构建时空图卷积网络(STGCN)进行城市交通流预测。通过将交通网络建模为图结构,并融合时间卷积与空间图卷积,STGCN能有效捕捉交通流的时空依赖性。文章提供了从数据预处理、核心模块(TimeBlock与STGCNBlock)搭建、模型训练到实战技巧的完整指南,帮助开发者快速掌握这一前沿的交通速度预测技术。 阅读详情

相关推荐

STM32F103新手必看:0.96寸OLED屏幕从接线到动态显示全攻略(附IIC避坑指南)

本文为STM32F103新手提供了0.96寸OLED屏幕从硬件接线到软件驱动的完整实战指南。重点解析了IIC通信的时序、设备地址(0x78/0x7A)的常见陷阱,并详细演示了如何实现字符显示与平滑滚动显示等动态效果,帮助开发者快速上手并避开常见调试难题。

stone的博客 552

JSP导出excel时中文乱码的问题

Web应用导出Excel报表的简单实现(HTML) 在Web应用中,很多数据经常要导出成Excel文档。用专门的生成真正的Excel文档的方式比较复杂,不太好用。所以经常用一种简单的方式来实现,即将报表保存为HTML格式,然后用Excel打开。 实现方式: 第一步,用JSP实现HTML版本的报表 第二步,在该JSP页面头部设置response的ContentType为Excel格式

cq_china的专栏 792

博士申请-考核制经验分享(2)——个人简历

申博过程中一般在联系导师时就将个人简历作为邮件附件,有些学校也会在提交材料或者复试阶段提交个人简历。

weixin_49282401的博客 5523

解决HttpServletResponse输出的中文乱码问题

首先,response返回有两种,一种是字节流outputstream,一种是字符流printwrite。 申明:这里为了方便起见,所有输出都统一用UTF-8编码。 先说字节流,要输出“中国",给输出流的必须是转换为utf-8的“中国”,还要告诉浏览器,用utf8来解析数据 //这句话的意思,是让浏览器用utf8来解析返回的数据         response.se

simon_1的专栏 14万+

微信图片.dat文件解密实战:用Python一键转PNG(附完整代码)

本文详细介绍了如何通过Python解密微信图片.dat文件并转换为PNG格式的完整教程。文章深入解析了微信.dat文件的异或加密原理,提供了自动检测密钥的Python脚本,并分享了批量解密和性能优化的实用技巧,帮助用户轻松恢复和整理微信聊天图片。

weixin_29096377的博客 464

【CSP-J/S初赛知识点整理】

CSP-J/S初赛知识点整理

qq_43884946的博客 1万+

[转载]用jsp动态输出excel文档和中文乱码问题的解决

用jsp动态输出excel文档和中文乱码问题的解决最近在网上看到一个用java来操纵excel的open source,在weblogic上试用了一下,觉得很不错,特此向大家推荐一下。首先去http://www.andykhan...

congji3817的博客 149

Python爬虫实战:股票历史数据抓取与量化回测全流程详解

我们以**东方财富网(eastmoney.com)和雪球网(xueqiu.com)**为主要目标,演示如何爬取A股历史行情。最常用的HTTP请求库,简单易用,适合静态页面数据请求。本文详细介绍了从股票历史数据抓取到简单回测的完整流程,代码示例基于最新技术,结构清晰,适合初学者和进阶者学习量化投资实战。希望对你入门Python爬虫和量化交易有所帮助!

2201_76125261的博客 1778

java excel 中文乱码_JSP动态输出Excel及中文乱码的解决

最近在网上看到一个用java来操纵excel的open source,在weblogic上试用了一下,觉得很不错,特此向大家推荐一下。首先去http://www.andykhan.com/jexcelapi/index.html下载最新的JExcelApi,把jxl.jar置于你的classpath中。写一个javaBean,利用JExcelApi来动态生成excel文档,我这里写一个最简单的,示...

weixin_33152959的博客 254

Modbus协议学习第一篇之基础概念

因工作需要而接触Modbus,正在恶补知识,利用博客的方式来加深理解和记忆,同时希望同行大佬能一起交流。

hzf978742221的博客 880

思博伦仪表打流测试使用总结

下图红框中的checkbox为选中状态时,表示该流会携带测试仪做一些分析,包括时延和乱序等信息时需要的一些字节,当改选项选中时,如配置IPv4的TCP流,最小字节长度必须为78字节;如果需要64字节的TCP流,改选项必须不选中;

陌上花开缓缓归以的博客 1464

java写入excel乱码_java 导出excel中文乱码的问题

最近在网上看到一个用java来操纵Excel的open source,在weblogic上试用了一下,觉得很不错,特此向大家推荐一下。写一个javaBean,利用JExcelApi来动态生成excel文档,我这里写一个最简单的,示意性的。复杂的你可能还要查询数据库什么的。///////////////////////////Test.java////////////////////////////...

weixin_34885009的博客 2323

C#跨平台制图新纪元:Mapsui,一库在手,地图我有

深入学习Mapsui的渲染机制,定制属于你的地图样式,无论是颜色、图标还是文字,都可以随心所欲。

java专栏 1455

JSP动态输出Excel及中文乱码的解决 选择自 geyu 的 Blog

最近在网上看到一个用java来操纵excel的open source,在weblogic上试用了一下,觉得很不错,特此向大家推荐一下。   首先去http://www.andykhan.com/jexcelapi/index.html下载最新的JExcelApi,把jxl.jar置于你的classpath中。  写一个javaBean,利用JExcelApi来动态生成excel文档,我这里写一个最

974

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

JSP动态输出Excel及中文乱码的解决-JSP教程,Jsp/Servlet

[size=x-large]最近在网上看到一个用java来操纵excel的open source,在weblogic上试用了一下,觉得很不错,特此向大家推荐一下。   首先去http://www.andykhan.com/jexcelapi/index.html下载最新的jexcelapi,把jxl.jar置于你的classpath中。   写一个javabean,利用jexcel...

thtwinj2ee的专栏 215

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

用jxl解决jsp/java中excel处理问题

下载 jxl.jar的地址 http://www.andykhan.com/jexcelapi/index.html 下载最新版的jexcelap,如jexcelapi_2_6.tar.gz 解压缩,将其中的jxl.jar导入工程 解决中文问题  写一个javaBean,利用JExcelApi来动态生成excel文档,我这里写一个最简单的,示意性的。复杂的你可能还要

tingqier的专栏 2935

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

JSP页面中导出Excel文件及其中文乱码的解决办法

Web应用导出Excel报表的 简单实现(HTML) 在Web应用中,很多数据经常要导出成Excel文 档。用专门的生成真正的Excel文档的方式比较复杂,不太好用。所以经常用一种简单的方式来实现,即将报表保存为HTML格式,然后用Excel打开。 实现方式: 第一步,用JSP实现HTML版本的报表 第二步,在该JSP页面头部设置response的ContentTyp...

TAINK 465
上一篇: 简单的网页关键词匹配工具
下一篇: 使用JFreeReport生成报表
fraternity_java
博客等级 码龄22年 1粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值