在网上参考了一些资料,最后进行了整理。
转载声明1:https://www.cnblogs.com/itred/p/4826028.html 作者:itRed 邮箱:it_red@sina.com 博客链接:http://www.cnblogs.com/itred GitHub链接:http://github.com/itred
转载声明2:https://blog.csdn.net/qq_32253371/article/details/78083391
转载声明3:https://www.cnblogs.com/freeweb/p/5079316.html
所需jar包,附赠gson和fastjson
链接:https://pan.baidu.com/s/1djXQVQr_nbc-1Qd2KHOdVQ
提取码:rilk
首先得搭好sturts2,上面第二条链接,此段代码获得json数据格式是一个json数组,如[{"a":"w","b":"w"},{"a":"s","b":"s"}]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import jxl.Workbook;
import jxl.format.UnderlineStyle;
import jxl.write.Colour;
import jxl.write.Label;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
/**
* 第三方插件导出Excel
*
* @author Red
*/
public class WriteExcelAction extends ActionSupport {
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
OutputStream out = null;
String result = "";
BufferedReader in = null;
StringBuffer sb = null;
int count= 0;;
public void writeExcel() throws RowsExceededException, WriteException, IOException {
OutputStream os = response.getOutputStream();// 取得输出流
response.reset();// 清空输出流
response.setHeader("Content-disposition", "attachment; filename=testRed.xls");// 设定输出文件头
response.setContentType("application/msexcel");// 定义输出类型
WritableWorkbook wbook = Workbook.createWorkbook(os); // 建立excel文件
String tmptitle = "1"; // 标题
WritableSheet wsheet = wbook.createSheet(tmptitle, 0); // sheet名称
// 设置excel标题
WritableFont wfont = new WritableFont(WritableFont.ARIAL, 16, WritableFont.BOLD, false,
UnderlineStyle.NO_UNDERLINE, Colour.BLACK);
WritableCellFormat wcfFC = new WritableCellFormat(wfont);
wcfFC.setBackground(Colour.AQUA);
wsheet.addCell(new Label(1, 0, tmptitle, wcfFC));
wfont = new jxl.write.WritableFont(WritableFont.ARIAL, 14, WritableFont.BOLD, false,
UnderlineStyle.NO_UNDERLINE, Colour.BLACK);
wcfFC = new WritableCellFormat(wfont);
// 开始生成主体内容
wsheet.addCell(new Label(0, 2, "性别"));
wsheet.addCell(new Label(1, 2, "年龄"));
wsheet.addCell(new Label(2, 2, "身份证"));
String urlNameString = XXX";
URL realUrl = new URL(urlNameString);
URLConnection connection = realUrl.openConnection();
connection.connect();
in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "utf-8"));
String line;
while ((line = in.readLine()) != null) {
result += line;
//result += "\r\n";
}
JSONArray jArray = JSONArray.fromObject(result);
for (int i = 0; i < jArray.length(); i++) {
JSONObject subObject = jArray.getJSONObject(i);
wsheet.addCell(new Label(0, count + 3, subObject.getString("xxx")));
wsheet.addCell(new Label(1, count + 3, subObject.getInt("xxx")+"")+"");
wsheet.addCell(new Label(2, count + 3, subObject.getString("xxx")));
count++;
}
// 主体内容生成结束
wbook.write(); // 写入文件
wbook.close();
os.close(); // 关闭流
}
}
excel最大存储65536行数据,如果数据超过了,会报异常:jxl.write.biff.RowsExceededException: The maximum number of rows permitted on a worksheet been exceeded,这里建议分批次下载,比如第一次限定下载到65500就结束下载,
if(count > 65500) {
break;
}
第二次将循环开始值设为65501;
for (int i = 65501; i < jArray.length(); i++) {
这样就解决了,数据量过大的问题。