ExcleBuild.java//生成Execl所要的类 package com.richsoft.sxdl.session.tools.graphics; import java.io.OutputStream; import java.util.ArrayList; import java.util.List; import jxl.Workbook; import jxl.WorkbookSettings; import jxl.format.Alignment; import jxl.format.Border; import jxl.format.BorderLineStyle; import jxl.format.VerticalAlignment; import jxl.write.Label; import jxl.write.WritableCellFormat; import jxl.write.WritableFont; import jxl.write.WritableSheet; import jxl.write.WritableWorkbook; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import com.richsoft.sxdl.session.tools.graphics.Module.Position; /** * 生成Excle 封闭类 * @author Administrator * */ public class ExcleBuild { /** * 根据 json 串 封装数组 * @param json * @return */ public List<Module> getList(String json){ List<Module> list = new ArrayList<Module>();//生成Excle所要的数据 JSONArray jons = JSONArray.fromObject(json); int col_length = 0; //2维数组长 int row_length = jons.size(); //2维数组宽 for(int i=0;i<jons.getJSONArray(0).size();i++){ JSONObject ojb = jons.getJSONArray(0).getJSONObject(i); col_length+=ojb.getInt("colspan"); } //根据table封装数据 String[][] table = new String[row_length][col_length];//把json数组转化为2维数组 /** * 给2维数组赋初始值 */ for(int i=0;i<table.length;i++){ for(int j=0;j<table[i].length;j++){ table[i][j]="#"; } } /** * 给2维数组赋值 */ for(int i=0;i<row_length;i++){ JSONArray array = jons.getJSONArray(i); int col_index = 0;//记录二维数组到那个例 for(int j=0;j<array.size();j++){ Module m = new Module(); JSONObject ojb = jons.getJSONArray(i).getJSONObject(j); String title = ojb.getString("title"); int col_num = ojb.getInt("colspan"); int row_num = ojb.getInt("rowspan"); m.setTitle(title); if(col_num>1 || row_num>1){//跨行或跨例 if(col_num>1 && row_num>1){//根据json数据中colspan和rowspan都大于1时 就是即跨行,又跨例 for(int w=i;w<(i+row_num);w++){ for(int c=col_index;c<(col_index+col_num);c++){ if("#".equals(table[w][c])){//当二维数组还是初始值时(也就是/跨行或跨例没有影响这个单元格) m.addList(m.getPosition(w, c)); table[w][c] = title; }else{ for(int h=col_index;h<table.length;h++){ if(!"#".equals(table[w][h])){ continue; } m.addList(m.getPosition(w, h)); table[w][h]=title; break; } } } } col_index+=row_num; }else{//跨行或跨例 if(col_num>1){//只跨例时 for(int c=col_index;c<(col_index+col_num);c++){ if("#".equals(table[i][c])){ m.addList(m.getPosition(i, c)); table[i][c] = title; }else{ for(int h=col_index;h<table.length;h++){ if(!"#".equals(table[i][h])){ continue; } m.addList(m.getPosition(i, h)); table[i][h]=title; break; } } } col_index+=col_num-1;//当跨例时我们的两维数组的列只加了一个,所以还要把它跨几例也要加上 } if(row_num>1){//只跨行 for(int c=i;c<(i+row_num);c++){ if("#".equals(table[c][col_index])){ m.addList(m.getPosition(c, col_index)); table[c][col_index]= title; }else{ for(; col_index<table[i].length;col_index++){ if(!"#".equals(table[c][col_index])){ continue; }else{ m.addList(m.getPosition(c, col_index)); table[c][col_index] = title; break; } } } } } } }else{//没跨行也没有跨例 if("#".equals(table[i][col_index])){ m.addList(m.getPosition(i, col_index)); table[i][col_index] = title; }else{ for(;col_index<table[i].length;col_index++){ if(!"#".equals(table[i][col_index])){ continue; } m.addList(m.getPosition(i, col_index)); table[i][col_index] = title; break; } } } col_index++; list.add(m); } } return list; } /** * 生成成Excle * @param list 数据 * @param out 输出流 */ public static void writeTable(List<Module> list,OutputStream out){ try { WritableFont NormalFont = new WritableFont(WritableFont.ARIAL, 10); WritableFont BoldFont = new WritableFont(WritableFont.ARIAL, 14,WritableFont.BOLD); WritableFont tableFont = new WritableFont(WritableFont.ARIAL, 12,WritableFont.NO_BOLD); WritableFont baodanFont = new WritableFont(WritableFont.ARIAL, 10,WritableFont.BOLD); WritableCellFormat wcf_center = new WritableCellFormat(NormalFont); wcf_center.setBorder(Border.ALL, BorderLineStyle.THIN); //把垂直对齐方式指定为居中 wcf_center.setVerticalAlignment(VerticalAlignment.CENTRE); //把水平对齐方式指定为居中 wcf_center.setAlignment(Alignment.CENTRE); wcf_center.setWrap(true); WorkbookSettings setting = new WorkbookSettings();//对excl基础信息的设置 java.util.Locale locale = new java.util.Locale("zh", "CN"); setting.setLocale(locale); setting.setEncoding("utf-8"); // 打开文件 WritableWorkbook book = Workbook.createWorkbook(out,setting); WritableSheet sheet = book.createSheet("第一页", 0); // 写入数据并关闭文件 for (Module module : list) { List<Position> plist = module.getList(); if(plist.size()>1){ sheet.mergeCells(plist.get(0).getCol(),plist.get(0).getRow() , plist.get(plist.size()-1).getCol(), plist.get(plist.size()-1).getRow()); Label label = new Label(plist.get(0).getCol(),plist.get(0).getRow(),module.getTitle(),wcf_center); sheet.addCell(label); }else if(plist.size()==1){ Label label = new Label(plist.get(0).getCol(),plist.get(0).getRow() , module.getTitle(),wcf_center); sheet.addCell(label); } } book.write(); book.close(); } catch (Exception e) { e.printStackTrace(); } } }
Servlet package com.richsoft.sxdl.session.tools.servlet; import java.io.IOException; import java.util.List; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.richsoft.sxdl.session.tools.graphics.ExcleBuild; import com.richsoft.sxdl.session.tools.graphics.Module; public class DowlaodExcle extends HttpServlet { private static final long serialVersionUID = 1L; public DowlaodExcle() { super(); } public void destroy() { super.destroy(); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("application/vnd.ms-excel"); response.setHeader("Content-Disposition", "attachment;filename=download.xls"); String json = request.getParameter("json"); ServletOutputStream out = response.getOutputStream(); ExcleBuild eb = new ExcleBuild(); List<Module> list = eb.getList(json); eb.writeTable(list,out); } public void init() throws ServletException { } }
package com.richsoft.sxdl.session.tools.graphics; import java.util.ArrayList; import java.util.List; public class Module { private String title; List<Position> list = new ArrayList<Position>(); public void addList(Position p){ list.add(p); } public Position getPosition(int row,int col){ return new Position(row,col); } class Position { private int row; private int col; public Position() { } public Position(int row,int col) { this.row = row; this.col = col; } public int getRow() { return row; } public void setRow(int row) { this.row = row; } public int getCol() { return col; } public void setCol(int col) { this.col = col; } } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public List<Position> getList() { return list; } public void setList(List<Position> list) { this.list = list; } }
function dowloadExcle(id){//id 是你表格id的名子 var trs = $("tr",$("#"+id)); var str = "["; $.each(trs,function(i,n){ var tds = $("td,th",$(n)); str+="[" $.each(tds,function(j,f){ var rowspan = $(f).attr("rowspan")?$(f).attr("rowspan"):1; var colspan = $(f).attr("colspan")?$(f).attr("colspan"):1; str+="{'title':'"+fileScript($.trim($(f).text()))+"','rowspan':"+rowspan+",'colspan':"+colspan+"},"; }); if(tds.length>0) str=str.substring(0,str.length-1); str+="],"; }); if(str.length>2) str=str.substring(0,str.length-1); str+="]"; var html ="<form style='display:none;' id='excleForm' action='"+path+"/tool/DowlaodExcle' method='post'>"; html+="<input type='hidden' id='exjson' name='json' value=\""+str+"\"/>"; html+="</form>"; if($("#excleForm").size()==0){ $(document.body).append(html); }else{ var obj = document.getElementById("exjson"); if(obj){ obj.value = str; } } document.getElementById("excleForm").submit(); }
String json = "[" + "[{'title':'所有仓库','rowspan':3,'colspan':1},{'title':'所有货架','rowspan':3,'colspan':1},{'title':'工器具统计','rowspan':1,'colspan':7}]," + "[{'title':'工器具总数','rowspan':2,'colspan':1},{'title':'在库','rowspan':1,'colspan':4},{'title':'出库','rowspan':1,'colspan':2}]," + "[{'title':'正常','rowspan':1,'colspan':1},{'title':'损坏','rowspan':1,'colspan':1},{'title':'报废','rowspan':1,'colspan':1},{'title':'试验过期','rowspan':1,'colspan':1},{'title':'使用出库','rowspan':1,'colspan':1},{'title':'试验出库','rowspan':1,'colspan':1}]," + "[{'title':'山西仓库1','rowspan':2,'colspan':1},{'title':'未分配货架工器具','rowspan':1,'colspan':1},{'title':'8','rowspan':1,'colspan':1},{'title':'5','rowspan':1,'colspan':1},{'title':'3','rowspan':1,'colspan':1},{'title':'0','rowspan':1,'colspan':1},{'title':'0','rowspan':1,'colspan':1},{'title':'0','rowspan':1,'colspan':1},{'title':'0','rowspan':1,'colspan':1}]," + "[{'title':'货架总计','rowspan':1,'colspan':1},{'title':'8','rowspan':1,'colspan':1},{'title':'5','rowspan':1,'colspan':1},{'title':'3','rowspan':1,'colspan':1},{'title':'0','rowspan':1,'colspan':1},{'title':'0','rowspan':1,'colspan':1},{'title':'0','rowspan':1,'colspan':1},{'title':'0','rowspan':1,'colspan':1}]," + "[{'title':'仓库总数','rowspan':1,'colspan':2},{'title':'8','rowspan':1,'colspan':1},{'title':'5','rowspan':1,'colspan':1},{'title':'3','rowspan':1,'colspan':1},{'title':'0','rowspan':1,'colspan':1},{'title':'0','rowspan':1,'colspan':1},{'title':'0','rowspan':1,'colspan':1},{'title':'0','rowspan':1,'colspan':1}]" + "]";