首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > PowerDesigner >

jmesa 导出Excel题目,PDF 中文乱码解决

2012-11-05 
jmesa 导出Excel标题,PDF 中文乱码解决 Jmesa是ExtremeTable项目重新开发一个的Html表格组件,提供过滤、排

jmesa 导出Excel标题,PDF 中文乱码解决
    Jmesa是ExtremeTable项目重新开发一个的Html表格组件,提供过滤、排序、分页、数据导出等功能。Jmesa非常易于使用,可按自己的需求进行扩展。JMesa需要JDK1.5以上的环境。
   老外的好东西就是不支持中文尤其是java最让程序员头疼:
先看看Excal导出,Excal 导出本身没有问题(poi 本身对中文支持好),但是标题是乱码,这个问题主要是他需要展示在Web 端标题。
首先要下载jmesa 的源码包:http://code.google.com/p/jmesa/downloads/list
现在最新的是3.0。
既然的导出那就先看org.jmesa.view.excel.ExcelViewExporter 这个类

  public ExcelViewExporter(View view, CoreContext coreContext, HttpServletResponse response, String fileName) {        super(view, coreContext, response, fileName);    }

这句话是他处理导出文件,看来是父类处理的,OK那就改掉org.jmesa.view.AbstractViewExporter这个抽象类中的fileName,嗯他又交给了fn 响应那就直接改fn 转码:
这句话:
String fn = new String(fileName.getBytes(encoding), encoding);
改为:
String fn = new String(fileName.getBytes("GB2312"), "ISO-8859-1");

还有:
加上这句话:
response.setContentType("application/vnd.ms-excel;charset=utf-8");

如果是版本是2.3那就直接改
org.jmesa.view.excel.ExcelViewExporter这个类

response.setContentType("application/vnd.ms-excel;charset=UTF-8");
fileName = new String(fileName.getBytes(), "ISO-8859-1");//修改

这样的话所有导出的标题乱码问题解决了。

下面看看导出PDF,java 世界导出pdf 的方案常有的有两个:Jasper Report 和
iText ,其实Jasper Report 是对 iText 的封装,iText 比较原始,对中文支持非常差。哎,恰恰jmesa 用的就是iText 封装的pdf 导出
我们使用jmesa 的pdfp 导出,
如果是2.4之前的jmesa 版本需要修改org.jmesa.view.pdfp.PdfPView
这个类的render()方法,具体修改方式为:
public PdfPTable render() {    //增加的代码******************     Font cellFont = null;     Font headerCellFont = null;           if(fontName != null && fontEncoding != null){               try {                   BaseFont bfChinese = BaseFont.createFont("c:\\windows\\fonts\\simsun.ttc,1",BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);                   cellFont = new Font(bfChinese, 12F, Font.NORMAL);                  headerCellFont=new Font(bfChinese, 12F, Font.NORMAL,getHeaderFontColor());                                } catch(Exception e) {                   e.printStackTrace();               }           }           if( null == cellFont){               cellFont = FontFactory.getFont("Helvetica", 12F, 0);               headerCellFont = FontFactory.getFont("Helvetica", 12, Font.NORMAL, getHeaderFontColor());           }      //***********增加的代码结束        PdfPTable pdfpTable = new PdfPTable(getTable().getRow().getColumns().size());        pdfpTable.setSpacingBefore(3);        Row row = getTable().getRow();        List<Column> columns = row.getColumns();        // build table headers        for (Iterator<Column> iter = columns.iterator(); iter.hasNext();) {            Column column = iter.next();     //修改的代码            PdfPCell cell = new PdfPCell(new Paragraph(column.getTitle(),headerCellFont));            cell.setPadding(3.0f);            cell.setBackgroundColor(getHeaderBackgroundColor());            pdfpTable.addCell(cell);        }        // build table body        Collection<?> items = getCoreContext().getPageItems();        int rowcount = 0;        for (Object item : items) {            rowcount++;            columns = row.getColumns();            for (Iterator<Column> iter = columns.iterator(); iter.hasNext();) {                Column column = iter.next();                String property = column.getProperty();                Object value = column.getCellRenderer().getCellEditor().getValue(item, property, rowcount);      //修改的代码                PdfPCell cell = new PdfPCell(new Paragraph(value == null ? "" : String.valueOf(value), cellFont));        cell.setPadding(3.0f);                if (isRowEven(rowcount)) {                    cell.setBackgroundColor(getEvenCellBackgroundColor());                } else {                    cell.setBackgroundColor(getOddCellBackgroundColor());                }                pdfpTable.addCell(cell);            }        }        return pdfpTable;    }


如果jmesa 版本是3.0 那更好了,他已经对font 进行了封装,只不过老外恶心屏蔽了乱码异常,找到getFontWithColor 这个方法,改造他:
BaseFont baseFont = createFont(fontName,fontEncoding,BaseFont.NOT_EMBEDDED);
改为
BaseFont baseFont = createFont("c:\\windows\\fonts\\simsun.ttc,1",BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);

这个调用的是windows 自身的字体处理机制,别的字体 iText不支持啊,没办法就这么目前就这么办把,如果你是高手那就重写jmesa 导出文件的机制吧 哈哈~。

热点排行