『壹』 java导出数据到excel的几种方法的比较
Excel的两种导出入门方法(JAVA与js)
最近在做一个小项目作为练手,其中使用到了导出到Excel表格,一开始做的是使用JAVA的POI导出的,但因为我的数据是爬虫爬出来的,数据暂时并不保存在数据库或后台,所以直接显示在HTML的table,需要下载时又要将数据传回后台然后生成Excel文件,最后再从服务器下载到本地,过程几度经过网络传输,感觉比较耗时与浪费性能,于是想着在HTML中的Table直接导到Excel中节约资源
JAVA导出EXCEL(.xls)
导出Excel用的插件是apache的poi.jar,maven地址如下
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version></dependency>
1. 简单应用
先来个简化无样式的Excel导出,由于我的数据存在JSON中,所以形参是JSONArray,朋友们根据自己的实际数据类型(Map,List,Set等)传入即可 ,代码如下
/**
* 创建excel并填入数据
* @author LiQuanhui
* @date 2017年11月24日 下午5:25:13
* @param head 数据头
* @param body 主体数据
* @return HSSFWorkbook
*/
public static HSSFWorkbook expExcel(JSONArray head, JSONArray body) { //创建一个excel工作簿
HSSFWorkbook workbook = new HSSFWorkbook(); //创建一个sheet工作表
HSSFSheet sheet = workbook.createSheet("学生信息");
//创建第0行表头,再在这行里在创建单元格,并赋值
HSSFRow row = sheet.createRow(0);
HSSFCell cell = null; for (int i = 0; i < head.size(); i++) {
cell = row.createCell(i);
cell.setCellValue(head.getString(i));//设置值
}
//将主体数据填入Excel中
for (int i = 0, isize = body.size(); i < isize; i++) {
row = sheet.createRow(i + 1);
JSONArray stuInfo = body.getJSONArray(i); for (int j = 0, jsize = stuInfo.size(); j < jsize; j++) {
cell = row.createCell(j);
cell.setCellValue(stuInfo.getString(j));//设置值
}
} return workbook;
}
创建好Excel对象并填好值后(就是得到workbook),就是将这个对象以文件流的形式输出到本地上去,代码如下
/**
* 文件输出
* @author LiQuanhui
* @date 2017年11月24日 下午5:26:23
* @param workbook 填充好的workbook
* @param path 存放的位置
*/
public static void outFile(HSSFWorkbook workbook,String path) {
OutputStream os=null; try {
os = new FileOutputStream(new File(path));
workbook.write(os);
} catch (FileNotFoundException e1) {
e1.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
至此Excel的导出其实已经做完了。
2. 添加样式后导出
但通常这并不能满足我们的需求,因为通常是需要设置Excel的一些样式的,如字体、居中等等,设置单元格样式主要用到这个类(HSSFCellStyle)
HSSFCellStyle cellStyle = workbook.createCellStyle();
现在说说HSSFCellStyle都能干些什么
HSSFCellStyle cellStyle = workbook.createCellStyle();//创建单元格样式对象1.设置字体
HSSFFont font = workbook.createFont(); //font.setFontHeight((short)12);//这个设置字体会很大
font.setFontHeightInPoints((short)12);//这才是我们平常在Excel设置字体的值
font.setFontName("黑体");//字体:宋体、华文行楷等等
cellStyle.setFont(font);//将该字体设置进去2.设置对齐方式
cellStyle.setAlignment(horizontalAlignment);//horizontalAlignment参考下面给出的参数
//以下是最常用的三种对齐分别是居中,居左,居右,其余的写代码的时候按提示工具查看即可
HorizontalAlignment.CENTER
HorizontalAlignment.LEFT
HorizontalAlignment.RIGHT3.设置边框
cellStyle.setBorderBottom(border); // 下边框
cellStyle.setBorderLeft(border);// 左边框
cellStyle.setBorderTop(border);// 上边框
cellStyle.setBorderRight(border);// 右边框
//border的常用参数如下
BorderStyle.NONE 无边框
BorderStyle.THIN 细边框
BorderStyle.MEDIUM 中等粗边框
BorderStyle.THICK 粗边框//其余的我也描述不清是什么形状,有兴趣的到时可以直接测试
在经过一系列的添加样式之后,最后就会给单元格设置样式
cell.setCellStyle(cellStyle);
3. 自动调整列宽
sheet.autoSizeColumn(i);//i为第几列,需要全文都单元格居中的话,需要遍历所有的列数
4. 完整的案例
public class ExcelUtils { /**
* 创建excel并填入数据
* @author LiQuanhui
* @date 2017年11月24日 下午5:25:13
* @param head 数据头
* @param body 主体数据
* @return HSSFWorkbook
*/
public static HSSFWorkbook expExcel(JSONArray head, JSONArray body) {
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet("学生信息");
HSSFRow row = sheet.createRow(0);
HSSFCell cell = null;
HSSFCellStyle cellStyle = workbook.createCellStyle();
setBorderStyle(cellStyle, BorderStyle.THIN);
cellStyle.setFont(setFontStyle(workbook, "黑体", (short) 14));
cellStyle.setAlignment(HorizontalAlignment.CENTER);
for (int i = 0; i < head.size(); i++) {
cell = row.createCell(i);
cell.setCellValue(head.getString(i));
cell.setCellStyle(cellStyle);
}
HSSFCellStyle cellStyle2 = workbook.createCellStyle();
setBorderStyle(cellStyle2, BorderStyle.THIN);
cellStyle2.setFont(setFontStyle(workbook, "宋体", (short) 12));
cellStyle2.setAlignment(HorizontalAlignment.CENTER); for (int i = 0, isize = body.size(); i < isize; i++) {
row = sheet.createRow(i + 1);
JSONArray stuInfo = body.getJSONArray(i); for (int j = 0, jsize = stuInfo.size(); j < jsize; j++) {
cell = row.createCell(j);
cell.setCellValue(stuInfo.getString(j));
cell.setCellStyle(cellStyle2);
}
} for (int i = 0, isize = head.size(); i < isize; i++) {
sheet.autoSizeColumn(i);
} return workbook;
} /**
* 文件输出
* @author LiQuanhui
* @date 2017年11月24日 下午5:26:23
* @param workbook 填充好的workbook
* @param path 存放的位置
*/
public static void outFile(HSSFWorkbook workbook,String path) {
OutputStream os=null; try {
os = new FileOutputStream(new File(path));
workbook.write(os);
} catch (FileNotFoundException e1) {
e1.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 设置字体样式
* @author LiQuanhui
* @date 2017年11月24日 下午3:27:03
* @param workbook 工作簿
* @param name 字体类型
* @param height 字体大小
* @return HSSFFont
*/
private static HSSFFont setFontStyle(HSSFWorkbook workbook, String name, short height) {
HSSFFont font = workbook.createFont();
font.setFontHeightInPoints(height);
font.setFontName(name); return font;
} /**
* 设置单元格样式
* @author LiQuanhui
* @date 2017年11月24日 下午3:26:24
* @param workbook 工作簿
* @param border border样式
*/
private static void setBorderStyle(HSSFCellStyle cellStyle, BorderStyle border) {
cellStyle.setBorderBottom(border); // 下边框
cellStyle.setBorderLeft(border);// 左边框
cellStyle.setBorderTop(border);// 上边框
cellStyle.setBorderRight(border);// 右边框
}
}
POI的功能其实还是很强大的,这里只介绍了Excel的一丁点皮毛给入门的查看,如果想对Excel进行更多的设置可以查看下面的这篇文章,有着大量的使用说明。
空谷幽澜的POI使用详解
JS导出EXCEL(.xls)
java的Excel导出提供了强大的功能,但也对服务器造成了一定资源消耗,若能使用客户端的资源那真是太好了
1. 简单应用
JS的导出Excel非常简单,只需要引用Jquery和tableExport.js并设置一个属性即可
<script src="<%=basePath%>/static/js/tableExport.js" type="text/javascript"></script><script type="text/javascript">
function exportExcelWithJS(){ //获取要导出Excel的表格对象并设置tableExport方法,设置导出类型type为excel
$('#tableId').tableExport({ type:'excel'
});
}</script><button class="btn btn-primary" type="button" style="float: right;" onclick="exportExcelWithJS()">下载本表格</button>
JS的导出就完成了,是不是特别简单
2. 进阶应用
但上面仅仅是个简单的全表无样式的导出
这tableExport.js还有一些其他功能,忽略行,忽略列,设置样式等,属性如下
<script type="text/javascript">
function exportExcelWithJS(){ //获取要导出Excel的表格对象并设置tableExport方法,设置导出类型type为excel
$('#tableId').tableExport({ type:'excel',//导出为excel
fileName:'2017工资表',//文件名
worksheetName:'11月工资',//sheet表的名字
ignoreColumn:[0,1,2],//忽略的列,从0开始算
ignoreRow:[2,4,5],//忽略的行,从0开始算
excelstyles:['text-align']//使用样式,不用填值只写属性,值读取的是html中的
});
}</script>
如上既是JS的进阶导出,操作简单,容易上手
但有个弊端就是分页的情况下,只能导出分页出的数据,毕竟这就是导出HTML内TABLE有的东西,数据在数据库或后台的也就无能为力,所以这个适合的是无分页的TABLE导出
3. 额外说明
tableExport.js是gitHub上的hhurz大牛的一个开源项目,需要下载该JS的可以点击链接进入gitHub下载或在我的网络网盘下载密码:oafu
tableExport.js不仅仅是个导出Excel的JS,他还可以导出CSV、DOC、JSON、PDF、PNG、SQL、TSV、TXT、XLS (Excel 2000 HTML format)、XLSX (Excel 2007 Office Open XML format)、XML (Excel 2003 XML Spreadsheet format)、XML (Raw xml)多种格式,具体使用可以参考hhurz的使用介绍
本人在之前找了好几个导出Excel的都有各种各样的问题(乱码,无响应,无样式),这个是目前找到最好的一个了,能解决乱码问题,能有样式,非常强大
『贰』 怎么用java实现导出excel
/**
*@authorliuwu
* Excel的导入与导出
*/
@SuppressWarnings({"unchecked"})
publicclassExcelOperate{
/**
*@authorliuwu
*这是一个通用的方法,利用了JAVA的反射机制,
*可以将放置在JAVA集合中并且符合一定条件的数据以EXCEL的形式输出到指定IO设备上
*@paramtitle表格标题名
*@paramheaders表格属性列名数组
*@paramdataset需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。
* 此方法支持的javabean属性【数据类型有java基本数据类型及String,Date,byte[](图片转成字节码)】
*@paramout与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中
*@parampattern如果有时间数据,设定输出格式。默认为"yyy-MM-dd"
*@throwsIOException
*/
publicstaticvoidexportExcel(Stringtitle,String[]headers,Collection<?>dataset,OutputStreamout,Stringpattern)throwsIOException{
//声明一个工作薄
HSSFWorkbookworkbook=newHSSFWorkbook();
//生成一个表格
HSSFSheetsheet=workbook.createSheet(title);
//设置表格默认列宽度为15个字节
sheet.setDefaultColumnWidth((short)20);
//生成一个样式
HSSFCellStylestyle=workbook.createCellStyle();
//设置这些样式
style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);
style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
style.setBorderRight(HSSFCellStyle.BORDER_THIN);
style.setBorderTop(HSSFCellStyle.BORDER_THIN);
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
//生成一个字体
HSSFFontfont=workbook.createFont();
font.setColor(HSSFColor.VIOLET.index);
font.setFontHeightInPoints((short)12);
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
//把字体应用到当前的样式
style.setFont(font);
//生成并设置另一个样式
HSSFCellStylestyle2=workbook.createCellStyle();
style2.setFillForegroundColor(HSSFColor.LIGHT_YELLOW.index);
style2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
style2.setBorderBottom(HSSFCellStyle.BORDER_THIN);
style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);
style2.setBorderRight(HSSFCellStyle.BORDER_THIN);
style2.setBorderTop(HSSFCellStyle.BORDER_THIN);
style2.setAlignment(HSSFCellStyle.ALIGN_CENTER);
style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
//生成另一个字体
HSSFFontfont2=workbook.createFont();
font2.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
//把字体应用到当前的样式
style2.setFont(font2);
//产生表格标题行
HSSFRowrow=sheet.createRow(0);
for(shorti=0;i<headers.length;i++){
HSSFCellcell=row.createCell(i);
cell.setCellStyle(style);
HSSFRichTextStringtext=newHSSFRichTextString(headers[i]);
cell.setCellValue(text);
}
//遍历集合数据,产生数据行
Iterator<?>it=dataset.iterator();
intindex=0;
while(it.hasNext()){
index++;
row=sheet.createRow(index);
Objectt=it.next();
//利用反射,根据javabean属性的先后顺序,动态调用getXxx()方法得到属性值
Field[]fields=t.getClass().getDeclaredFields();
for(shorti=0;i<fields.length;i++){
HSSFCellcell=row.createCell(i);
cell.setCellStyle(style2);
Fieldfield=fields[i];
StringfieldName=field.getName();
StringgetMethodName="get"
+fieldName.substring(0,1).toUpperCase()
+fieldName.substring(1);//注意实体getSet不要自己改名字不然反射会有问题
try{
ClasstCls=t.getClass();
MethodgetMethod=tCls.getMethod(getMethodName,newClass[]{});
Objectvalue=getMethod.invoke(t,newObject[]{});
HSSFRichTextStringrichString=newHSSFRichTextString(value.toString());
HSSFFontfont3=workbook.createFont();
font3.setColor(HSSFColor.BLUE.index);
richString.applyFont(font3);
cell.setCellValue(richString);
}catch(SecurityExceptione){
e.printStackTrace();
e=null;
}catch(NoSuchMethodExceptione){
e.printStackTrace();
e=null;
}catch(IllegalArgumentExceptione){
e.printStackTrace();
e=null;
}catch(IllegalAccessExceptione){
e.printStackTrace();
e=null;
}catch(InvocationTargetExceptione){
e.printStackTrace();
e=null;
}finally{
//清理资源
}
}
}
try{
workbook.write(out);
}catch(IOExceptione){
e.printStackTrace();
e=null;
}
}
}
『叁』 java导出excel,excel打不开,报文件格式无效,怎么解决!
两个原因:
1.你的excel模版本身有问题,可以尝试新建一个模版。
2.你的excel使用了一些POI不支持的函数。
解决办法:
另存是由excel重写了完整的文件,可以解决问题。
关闭文件例子:
FileOutputStream os = new FileOutputStream("workbook.xls");
wb.write(os);
os.close();
在保护状态下execl的格式有可能正在被使用,你这边修改,准确说是线程冲突,一般excel值会作为导出文件的模板,是不会编辑的。你可以在读的时候判断execl是否正在被使用。
下面的代码问题,你可以参考
package com.hwt.glmf.common;
import java.io.IOException;
import java.io.OutputStream;
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.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.CellRangeAddress;
import org.apache.poi.hssf.util.HSSFColor;
/**
* 导出Excel公共方法
* @version 1.0
*
* @author wangcp
*
*/
public class ExportExcel extends BaseAction {
//显示的导出表的标题
private String title;
//导出表的列名
private String[] rowName ;
private List<Object[]> dataList = new ArrayList<Object[]>();
HttpServletResponse response;
//构造方法,传入要导出的数据
public ExportExcel(String title,String[] rowName,List<Object[]> dataList){
this.dataList = dataList;
this.rowName = rowName;
this.title = title;
}
/*
* 导出数据
* */
public void export() throws Exception{
try{
HSSFWorkbook workbook = new HSSFWorkbook(); // 创建工作簿对象
HSSFSheet sheet = workbook.createSheet(title); // 创建工作表
// 产生表格标题行
HSSFRow rowm = sheet.createRow(0);
HSSFCell cellTiltle = rowm.createCell(0);
//sheet样式定义【getColumnTopStyle()/getStyle()均为自定义方法 - 在下面 - 可扩展】
HSSFCellStyle columnTopStyle = this.getColumnTopStyle(workbook);//获取列头样式对象
HSSFCellStyle style = this.getStyle(workbook); //单元格样式对象
sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, (rowName.length-1)));
cellTiltle.setCellStyle(columnTopStyle);
cellTiltle.setCellValue(title);
// 定义所需列数
int columnNum = rowName.length;
HSSFRow rowRowName = sheet.createRow(2); // 在索引2的位置创建行(最顶端的行开始的第二行)
// 将列头设置到sheet的单元格中
for(int n=0;n<columnNum;n++){
HSSFCell cellRowName = rowRowName.createCell(n); //创建列头对应个数的单元格
cellRowName.setCellType(HSSFCell.CELL_TYPE_STRING); //设置列头单元格的数据类型
HSSFRichTextString text = new HSSFRichTextString(rowName[n]);
cellRowName.setCellValue(text); //设置列头单元格的值
cellRowName.setCellStyle(columnTopStyle); //设置列头单元格样式
}
『肆』 谁能给我一个详细的Java通过Apache POI导出Excel方法,最好能给完整代码
package com.test;
/**
* 需要的jar包:
* poi-3.0.2-FINAL-20080204.jar
* poi-contrib-3.0.2-FINAL-20080204.jar
*poi-scratchpad-3.0.2-FINAL-20080204.jar
* poi-3.5-beta6-20090622.jar
* geronimo-stax-api_1.0_spec-1.0.jar
* ooxml-schemas-1.0.jar
* openxml4j-bin-beta.jar
* poi-ooxml-3.5-beta6-20090622.jar
*xmlbeans-2.3.0.jar
* dom4j-1.6.1.jar
*/
import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringWriter;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.util.PDFTextStripper;
import org.apache.poi.POIOLE2TextExtractor;
import org.apache.poi.POITextExtractor;
import org.apache.poi.POIXMLDocument;
import org.apache.poi.POIXMLTextExtractor;
import org.apache.poi.extractor.ExtractorFactory;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hwpf.extractor.wordExtractor;
import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.poifs.filesystem.DirectoryEntry;
import org.apache.poi.poifs.filesystem.DocumentEntry;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.xslf.extractor.XSLFPowerPointExtractor;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
import org.apache.xmlbeans.XmlException;
public class WordAndExcelExtractor {
public static void main(String[] args) {
try {
// 读取word
String wordFile = "D:/1.doc";
//String wordText2007 = WordAndExcelExtractor.extractTextFromDOC2007(wordFile);
//System.out.println("wordText2007=======" + wordText2007);
InputStream isword = new FileInputStream(wordFile);
WordExtractor wordExtractor = new WordExtractor(isword);
System.out.println("word========" + wordExtractor.getText());
// 读取 Excel
InputStream is = new FileInputStream("D:/测试.xls");
String excelText = WordAndExcelExtractor.extractTextFromXLS(is);
System.out.println("text2003==========" + excelText);
String excelFile = "D:/test2.xlsx";
String excelText2007 = WordAndExcelExtractor
.extractTextFromXLS2007(excelFile);
System.out.println("excelText2007==========" + excelText2007);
// 读取 PPT
PowerPointExtractor ppe = new PowerPointExtractor("D:/test.ppt");
System.out.println("ppt2003===============" + ppe.getText());
// System.out.println("###############################");
// System.out.println(ppe.getText(true, true, true, true));
//
// InputStream is = new FileInputStream("D:/test.ppt");
// PowerPointExtractor ppt2003 = new PowerPointExtractor(is);
// System.out.println(ppt2003.getText());
System.out.println("************************************");
XSLFPowerPointExtractor ppt = new XSLFPowerPointExtractor(
POIXMLDocument.openPackage("D:/test2.pptx"));
System.out.println("ppt2007============================="
+ ppt.getText());
/* 读取PDF */
InputStream in = new FileInputStream("D:/test.pdf");
PDDocument pdfDocument = PDDocument.load(in);
if (pdfDocument.isEncrypted()) {
// 仅仅尝试使用默认密码打开加密的PDF
pdfDocument.decrypt("");
}
PDFTextStripper stripper = null;
// 创建一个writer用来作来存储文件正文
StringWriter writer = new StringWriter();
if (stripper == null) {
stripper = new PDFTextStripper();
} else {
stripper.resetEngine();
}
stripper.writeText(pdfDocument, writer);
String contents = writer.getBuffer().toString();
System.out.println("pdfd===" + contents);
/* 向Word中写入数据 */
byte[] a = contents.getBytes();
ByteArrayInputStream bs = new ByteArrayInputStream(a);
POIFSFileSystem fs = new POIFSFileSystem();
// /////////////////////////////////
DirectoryEntry directory = fs.getRoot();
DocumentEntry de = directory.createDocument("WordDocument", bs);
// 以上两句代码不能省略,否则输出的是乱码
FileOutputStream fos = new FileOutputStream("D:\\dd.doc");
fs.writeFilesystem(fos);
bs.close();
fos.flush();
fos.close();
System.out.println("写入成功");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* @Method: extractTextFromXLS
* @Description: 从excel 2003档中提取纯文本
*
* @param
* @return String
* @throws
*/
@SuppressWarnings("deprecation")
private static String extractTextFromXLS(InputStream is) throws IOException {
StringBuffer content = new StringBuffer();
HSSFWorkbook workbook = new HSSFWorkbook(is); // 创建对Excel工作簿文件的引用
for (int numSheets = 0; numSheets < workbook.getNumberOfSheets(); numSheets++) {
if (null != workbook.getSheetAt(numSheets)) {
HSSFSheet aSheet = workbook.getSheetAt(numSheets); // 获得一个sheet
content.append(aSheet.getSheetName());
content.append("\r\n-----------------------\r\n");
for (int rowNumOfSheet = 0; rowNumOfSheet <= aSheet
.getLastRowNum(); rowNumOfSheet++) {
if (null != aSheet.getRow(rowNumOfSheet)) {
HSSFRow aRow = aSheet.getRow(rowNumOfSheet); // 获得一行
for (short cellNumOfRow = 0; cellNumOfRow <= aRow
.getLastCellNum(); cellNumOfRow++) {
if (null != aRow.getCell(cellNumOfRow)) {
HSSFCell aCell = aRow.getCell(cellNumOfRow); // 获得列值
if (aCell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {
content.append(aCell.getNumericCellValue());
} else if (aCell.getCellType() == HSSFCell.CELL_TYPE_BOOLEAN) {
content.append(aCell.getBooleanCellValue());
} else {
content.append(aCell.getStringCellValue());
}
content.append("\t");
}
}
content.append("\r\n");
}
}
}
}
return content.toString();
}
/**
* @Method: extractTextFromXLS2007
* @Description: 从excel 2007文档中提取纯文本
*
* @param
* @return String
* @throws
*/
private static String extractTextFromXLS2007(String fileName)
throws Exception {
StringBuffer content = new StringBuffer();
// 构造 XSSFWorkbook 对象,strPath 传入文件路径
XSSFWorkbook xwb = new XSSFWorkbook(fileName);
// 循环工作表Sheet
for (int numSheet = 0; numSheet < xwb.getNumberOfSheets(); numSheet++) {
XSSFSheet xSheet = xwb.getSheetAt(numSheet);
if (xSheet == null) {
continue;
}
// 循环行Row
for (int rowNum = 0; rowNum <= xSheet.getLastRowNum(); rowNum++) {
XSSFRow xRow = xSheet.getRow(rowNum);
if (xRow == null) {
continue;
}
// 循环列Cell
for (int cellNum = 0; cellNum <= xRow.getLastCellNum(); cellNum++) {
XSSFCell xCell = xRow.getCell(cellNum);
if (xCell == null) {
continue;
}
if (xCell.getCellType() == XSSFCell.CELL_TYPE_BOOLEAN) {
content.append(xCell.getBooleanCellValue());
} else if (xCell.getCellType() == XSSFCell.CELL_TYPE_NUMERIC) {
content.append(xCell.getNumericCellValue());
} else {
content.append(xCell.getStringCellValue());
}
}
}
}
return content.toString();
}
}
这是POI jar包的下载地址,我下载的是3.9版本的
http://poi.apache.org/download.html
『伍』 java JXL操作EXCEL创建文件后缀名为.xlsx的,也就是2007版本以上的
try{
SysCodeTemplateForm scpForm = (SysCodeTemplateForm) form;
FormFile formfile = scpForm.getUploadfile();
SysCodeTemplate scp = new SysCodeTemplate();
String reportfn = formfile.getFileName();
String savePath = "D:\\";
byte[] b = formfile.getFileData();
File file = new File(savePath);
if (!file.exists()) {
file.mkdirs();
}
File uploadFile = new File(file, reportfn);
FileOutputStream fops = new FileOutputStream(uploadFile);
fops.write(b);
fops.close();
XSSFWorkbook wookbook = new XSSFWorkbook(new FileInputStream(uploadFile));
XSSFSheet sheet = wookbook.getSheet("Sheet1");
int rows = sheet.getPhysicalNumberOfRows();
ArrayList<SysCodeTemplate> list1 = new ArrayList<SysCodeTemplate>();
ArrayList<SysCode> list2 = new ArrayList<SysCode>();
for (int i = 1; i < rows; i++) {
XSSFRow row = sheet.getRow(i);
if (row != null) {
int cells = row.getPhysicalNumberOfCells();
String value = "";
for (int j = 0; j < cells; j++) {
XSSFCell cell = row.getCell(j);
if (cell != null) {
switch (cell.getCellType()) {
case XSSFCell.CELL_TYPE_NUMERIC:
value += (long)cell.getNumericCellValue() + ",";
break;
case XSSFCell.CELL_TYPE_STRING:
value += cell.getStringCellValue() + ",";
break;
}
}
}
String valu = value.substring(0, value.length()-1);
String[] val = valu.split(",");
scp.setCodeCode(val[0]);
scp.setCodeName(val[1]);
scp.setCodeType(new Long(val[2]));
list1.add(scp);
}
}
『陆』 java将数据导出excel计算其文件大小
热门频道
首页
博客
研修院
VIP
APP
问答
下载
社区
推荐频道
活动
招聘
专题
打开CSDN APP
Copyright © 1999-2020, CSDN.NET, All Rights Reserved
打开APP
大数据导出excel大小限制_java 导出Excel 大数据量,自己经验总结! 原创
2020-12-19 01:58:16
weixin_39655377
码龄5年
关注
分析导出实现代码,XLSX支持:
/*** 生成XLSX,2007版本的excel,每个sheet无6.5W的行数限制,但是到了一定数量,可能内存溢出,
* 次方法适合在预计10W以下的数据导出时使用,本机测试,14W可以导出。列数量在8列左右
*
*@paramfileOut
* 输出流
*@paramsheetMap
* 要设置的数据信息
*@throwsSQLException*/
public static voidcreateXSLXByResultSet(OutputStream fileOut, WriteXLSBean... beans)throwsSQLException {try{//重点 Workbook
Workbook wb = newXSSFWorkbook();for (int i = 0, len = beans.length; i < len; i++) {
WriteXLSBean xlsBean=beans[i];
Sheet sheet=wb.createSheet(xlsBean.getSheetName());
ResultSet rs=xlsBean.getRs();
ResultSetMetaData rsmd=rs.getMetaData();
TypeHandlerRegistry tr=BeanContext.tr;
Map th =xlsBean.getTh();int index = 0;while(rs.next()) {long t1 =System.currentTimeMillis();
org.apache.poi.ss.usermodel.Row row=sheet
.createRow(index);for (int j = 0, numberOfColumns = rsmd.getColumnCount(); j < numberOfColumns; j++) {
String key= rsmd.getColumnLabel(j + 1).toLowerCase();if(th.containsKey(key)) {
TypeHandler> type =tr.getTypeHandler(JdbcType
.forCode(rsmd.getColumnType(j+ 1)));
Object obj=type.getResult(rs, key);
row.createCell(j).setCellValue(obj== null ? "": obj.toString());
}
}
System.out.println(index+ " :"
+ (System.currentTimeMillis() -t1));
index++;
}
}//重点 Workbook
wb.write(fileOut);
}catch(IOException e) {
e.printStackTrace();throw new ServiceRunTimeException("生产xls文档错误", e);
}finally{
}
}
在上面 标注了重点的两处,分别是:
1.构建一个Excel对象
2.将该对象写入一个OutPutStream
而在构建过程中,没有地方写入OutPutSteam ,也就是说必须在内存中构建整个 Excel,才能进行写出操作,在大数据量情况下,这样将导致所有数据加载到内存中,而不能输出,导致最后 内存溢出。
根据运行环境不用,可能内存溢出的 情况不同
根据情况,如果数据量达到10W以上,建议使用
1、多个Excel,每个Excel一个Sheet,因为所有Sheet都是Workbook的组成部分。如果不分多个Excel,即使分Sheet也没用,
2、每个Excel中列数适中,比如: 5W行每个Excel档,实现分多次导出和分页查询原理一样
3、对多个Excel导出到一个临时目录,并通过程序压缩,然后提供给客户下载
2003版通过数据库结果存到List中,然后进行生产:Table 就是List Row 是Map
/*** 生产xls,2003版本的excel,每个sheet有6.5W的行数限制
*
*@paramfileOut
* 输出流,未关闭
*@paramsheetMap
* 要导出的数据信息*/
public static void createXSLByMap(OutputStream fileOut, Map>>sheetMap) {try{
HSSFWorkbook wb= newHSSFWorkbook();
Set keys =sheetMap.keySet();for (Iterator iterator =keys.iterator(); iterator
.hasNext();) {
String SheetKey=iterator.next();
Sheet sheet=wb.createSheet(SheetKey);
List> sheetRows =sheetMap.get(SheetKey);for (int i = 0, len = sheetRows.size(); i < len; i++) {
Map cellMap =sheetRows.get(i);
Set cellSet =cellMap.keySet();
org.apache.poi.ss.usermodel.Row row=sheet.createRow(i);int j = 0;for (Iterator iterCell =cellSet.iterator(); iterCell
.hasNext(); j++) {
String cellKey=iterCell.next();
Object obj=cellMap.get(cellKey);
row.createCell(j).setCellValue(obj== null ? "": obj.toString());
}
}
}
wb.write(fileOut);
}catch(IOException e) {
e.printStackTrace();throw new ServiceRunTimeException("生产xls文档错误", e);
}finally{
}
}
新版本 POI+office 2007版本excel可以导出几十万条而不内存溢出,详细见:
导出大量数据到 excel 的 xlsx文件
static String src="SFGHJKJGHFERTUIO";
public static void main(String[] args) throwsThrowable {
SXSSFWorkbook wb = new SXSSFWorkbook(100); //这里100是在内存中的数量,如果大于此数量时,会写到硬盘,以避免在内存导致内存溢出
Sheet sh =wb.createSheet();
for (int rownum = 0; rownum < 1000000; rownum++) {
Row row =sh.createRow(rownum);
for (int cellnum = 0; cellnum < 10; cellnum++) {
Cell cell =row.createCell(cellnum);
String address = newCellReference(cell).formatAsString();
cell.setCellValue(address+src.substring(rownum%10*10+1, (rownum%10+1)*10));
}
}
File file = new File("F:/aa.xlsx");
file.createNewFile();
FileOutputStream out = newFileOutputStream(file);
wb.write(out);
out.close();
}
内存使用情况:
根据以上前辈经验,自己在结果自身需求考虑,整合出一个工具。解决了excle表.xls格式行数65535行的限制。我实现的形式是导出一张表,里面有多页
(我是已65000为一页)
这里是用反射来使用所有传入进行的实体的属性的值。这里只针对String和基本数据类型。如有自己定义的类型需要自己加上。
packagecom.tommy.fundation.util;importjava.lang.reflect.Field;importjava.lang.reflect.InvocationTargetException;importjava.lang.reflect.Method;importjava.util.ArrayList;importjava.util.Date;importjava.util.List;public classRelectUtil {public static List reflectEntity(T model,Class> cals) throwsNoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, SecurityException, NoSuchFieldException{
List list = new ArrayList();
Field[] field= model.getClass().getDeclaredFields(); //获取实体类的所有属性,返回Field数组
for(int j=0 ; j
String nam = field[j].getName(); //获取属性的名字
String name =nam;
name= name.substring(0,1).toUpperCase()+name.substring(1);
String type= field[j].getGenericType().toString(); //获取属性的类型
if(type.equals("class java.lang.String")){ //如果type是类类型,则前面包含"class ",后面跟类名
Method m = model.getClass().getMethod("get"+name);
String value= (String) m.invoke(model); //调用getter方法获取属性值
if(value != null){
list.add(value);
}else{
list.add("");
}
}if(type.equals("class java.lang.Integer")){
Method m= model.getClass().getMethod("get"+name);
Integer value=(Integer) m.invoke(model);if(value != null){
list.add(value);
}else{
list.add("");
}
}if(type.equals("class java.lang.Short")){
Method m= model.getClass().getMethod("get"+name);
Short value=(Short) m.invoke(model);if(value != null){
list.add(value);
}else{
list.add("");
}
}if(type.equals("class java.lang.Double")){
Method m= model.getClass().getMethod("get"+name);
Double value=(Double) m.invoke(model);if(value != null){
list.add(value);
}else{
list.add("");
}
}if(type.equals("class java.lang.Boolean")){
Method m= model.getClass().getMethod("get"+name);
Boolean value=(Boolean) m.invoke(model);if(value != null){
list.add(value);
}else{
list.add("");
}
}if(type.equals("class java.util.Date")){
Method m= model.getClass().getMethod("get"+name);
Date value=(Date) m.invoke(model);if(value != null){
list.add(value);
}else{
list.add("");
}
}
}returnlist;
}
}
下面将是重点实现导出excel表
packagecom.tommy.fundation.util;importjava.io.OutputStream;importjava.util.ArrayList;importjava.util.Date;importjava.util.HashMap;importjava.util.Iterator;importjava.util.List;importjava.util.Map;importjava.util.Set;importjavax.servlet.http.HttpServletResponse;importorg.apache.poi.hssf.record.formula.functions.T;importorg.apache.poi.hssf.usermodel.HSSFRow;importorg.apache.poi.hssf.usermodel.HSSFSheet;importorg.apache.poi.hssf.usermodel.HSSFWorkbook;
@SuppressWarnings("hiding")public class ExportExcel{/*** 导出多张excel表,解决xls格式行数65535的限制
*@authorOnlyOne
*@paramresponse
*@paramlist 需要处理的list数据集合
*@throwsException*/@SuppressWarnings("deprecation")public void doExcel(HttpServletResponse response,List list,String fileName) throwsException {
OutputStream os= response.getOutputStream();//获取输出流
response.reset();//设置下载头部信息。Content-disposition为属性名。attachment表示以附件方式下载,如果要在页面中打开,则改为inline。filename为文件名
response.setHeader("Content-disposition", "attachment; filename=excell.xls");
response.setContentType("application/msexcel");
Map> sheetMap =daData(list);
HSSFWorkbook wb= newHSSFWorkbook();
Set keys =sheetMap.keySet();for (Iterator iterator =keys.iterator(); iterator.hasNext();) {
Integer SheetKey=iterator.next();
HSSFSheet sheet= wb.createSheet((fileName+SheetKey).toString());
List sheetRows =sheetMap.get(SheetKey);for (int i = 0, len = sheetRows.size(); i < len; i++) {
T en=(T) sheetRows.get(i);
List dataList = RelectUtil.reflectEntity(en, en.getClass());
HSSFRow row=sheet.createRow(i);
row.createCell(0).setCellValue(String.valueOf(i));for(int m=0; m
row.createCell(m+1).setCellValue(dataList.get(m).toString());
}
}
}
wb.write(os);
}/*** 此方法将数据集合按65000个进行分割成多个子集合
*@authorOnlyOne
*@paramlist 需要处理的list数据集合
*@return
*/
public Map> daData(Listlist){int count = list.size()/65000;int yu = list.size() % 65000;
Map> map = new HashMap>();for (int i = 0; i <= count; i++) {
List subList = new ArrayList();if (i ==count) {
subList= list.subList(i * 65000, 65000 * i +yu);
}else{
subList= list.subList(i * 65000, 65000 * (i + 1)-1);
}
map.put(i, subList);
}returnmap;
}
}
在Java中调用的方式
@RequestMapping(value = "/doExcel", method =RequestMethod.GET)public void doExcel(HttpServletResponse response,HttpServletRequest request) throwsException {
List list =enrolltgService.findAll();new ExportExcel().doExcel(response, list, "黑白淡奶");
}
大功搞成,以后再也不会为了数据量太大而导不出来烦恼了!!!
需要的包 poi-3.2-FINAL-20081019.jar
相关资源:poi读取大文件Excel,使用xml格式解析,速度实测50mb文件13s,可指定...
打开CSDN,阅读体验更佳
POI多线程分表导出百万级大数据量EXCEL导出_Zhuo_chao的博客-CSDN博 ...
由上面可知 Excel 2003及以下是无法实现单sheet百万级的数据。 ApachePOI 简介 Apache POI 是用Java编写的免费开源的跨平台的 JavaAPI,Apache POI提供API给Java程式对Microsoft Office(Excel、WORD、PowerPoint、Visio等)格式档案读和写的功...
Java 使用POI导出数据到 excel,单 sheet 和多 sheet__修铁路的的博客...
单sheet 和多 sheet,用到的jar都是一样的,无非就是多创建一个 sheet的问题,以下是需要用到的jar包,在对应模块的pom.xml 中引入即可 <dependency> <groupId>org.apache.poi</groupId> ...
java导出excel超出65533行
业务背景: 列表导出,数据导出超过65533行 解决方案: 1、超出65533行,直接系统提示:本系统支持导出的最大条数为65533行 2、导出模版改为.xlsx,POI导出时用XSSFWorkbook,把所有数据都拿到内存里,可以导出超过65533行,但是上线之后,发现会内存溢出 3、导出模版改为.xlsx,POI导出时用SXSSFWorkbook,每次往内存里放一定的数据,导完之后,刷新,再次...
继续访问
Java的poi导出的excel不能超过256列的解决办法
Java的poi导出的excel不能超过256列的解决办法背景1、现在的情况2、解决办法 背景 1、现在的情况 excel文件名以.xls结尾 这个构造函数中默认采取这个类型 this.type = ExcelType.HSSF; public ExportParams(String title, String sheetName) { this.color = HSSFColorPredefined.WHITE.getIndex(); this.headerColor = HSSFC
继续访问
使用ApachePOI导出excel(多个sheet页)_我是橘子京的博客
2、设置导出excel路径 //导出的文件路径 String filePath="D:\\excel.xls"; 1 2 3、创建excel文件 //创建Excel文件(Workbook) HSSFWorkbook workbook = new HSSFWorkbook(); 1 2 4、设置单元格样式 //设置单元格样式 HSSFCel...
POI3.8 导出大数据excel(50万左右)_咖啡加糖_的博客_poi支持最...
import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.util.CellReference; import org.apache.poi.xssf.streaming.SXSSFWorkbook; ...
最新发布 【JAVA问题解决方案】01.EasyExcel导出数据超过Excel单表上限解决方案
1.了解一下Excel单表最多存储多少行数据(可以存储1048576条数据,1024的平方,2的20次方)。本文是介绍EasyExcel导出数据超过Excel单表上限解决方案。2.知道最多多少行就能以这个数为条件,如果超过则进行分表。3.分表的同时需要对数据进行分割,才能不超过最大限度。实体类(非常简单,为了导出表更快)
继续访问
java实现流输出形式导出数据(使用EasyExcel)并打包为zip包
java实现流输出形式文件下载并打包为zip包 pom.xml文件导入easyexcel <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.0.5</version> </d...
继续访问
...到excel文件(xls格式),附实验结果(单张sheet最多可有65536行)& Fi...
使用POI导出MySQL数据库数据到excel文件(xls格式) 注意事项:单张sheet最多存储65536行!否则报错! Caused by: java.lang.IllegalArgumentException: Invalid row number (65536) outside allowable range (0..65535) !
使用Apache POI导出百万条EXCEL数据_橙乐果果的博客
工作中,有这么一个需求:每天凌晨00:05分定时从数据库导出大于三个月的订单流水信息,保存为excel文件。 Just do it. 1.引入POM依赖 <!-- excel --> <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --> ...
Linux下读写文件操作
Linux下读写文件操作 #include<stdio.h> typedef struct Student { int no; char name[10]; int score; }Student; int main(int args,char *argv[]) { //打开文件 FILE *fp=fopen("test.txt","w"); if(fp=NULL) { perror("fopen"); ...
继续访问
Java导出超大Excel文件,防止内存溢出
Java导出超大Excel文件,防止内存溢出1.采用Poi中的SXSSFWorkbook2.maven中引入Poi3.测试过程4.单元测试Java代码5.结论 将业务数据导出到Excel表中,导出任务数据量较大时,导出的项目就会内存溢出,本文通过Java操作Poi的SXSSFWorkbook类进行导出,解决内存溢出问题。 1.采用Poi中的SXSSFWorkbook 在实现excel导出时,在数据量过大的情况下,总是容易发生内存溢出的情况。可以使用POI提供的 SXSSFWorkbook 类来避免内存溢
继续访问
Apache Poi导出Excel多Sheet页详解!_奥鹏马的博客
apache poi是目前比较常用导出excel的方式。最近想要实现一个导出excel多sheet页的功能。 网上查了一下大多都是针对某个具体对象的导出,不能实现任意对象的导出。现在将自己研究出的代码贴出来,供大家参考。 //注意:此处实现的关键是将...
Apache poi 导出多sheet的excel表格_朋态圈的博客
导出多sheet的excel */public class ApachePoi { public static void main(String[] args) throws IOException { // TODO Auto-generated method stub exportExcel();} @SuppressWarnings("resource") public static String exportExcel...
java导出excel限制大小_解决java poi导出excel2003不能超过65536行的问题
/*** 如果达到50000条数据则重新创建工作表的逻辑*/@Overridepublic void exportExcel(ListformList, ServletOutputStream outputStream){try{//工作表名后面的数字,如表1,表2int i = 0;//记录总行数int rownum = 0;//记录每个sheet的行数int tempnum = 0;//分页条...
继续访问
热门推荐 java poi 导出Excel 超大数据量解决方案
http://blog.csdn.net/qiaoshuai0920/article/details/51800991
继续访问
poi导出excel,实现一个excel中多个sheet(可解决poi导出限制65536的问题...
本文章的excel实现导出多个sheet是在上一篇poi导出的基础上实现的,这么久了,对于上一篇文章的poi也作出过一些优化。 这里我只贴修改了的方法的代码,其余的和上一篇文章的一样。 /** * 导出excel.在一个页面中单独导出Excel ...
基于Apache POI导出(百万级)大数据量Excel的实现_一朵风中摇曳的水仙...
支持单个 excel 的 sheet 导出100w 的数据 ApachePOI操作Excel对象 1.HSSF:操作Excel 2007之前版本(.xls)格式,生成的EXCEL不经过压缩直接导出 2.XSSF:操作Excel 2007及之后版本(.xlsx)格式,内存占用高于HSSF ...
解决POI的XSSFWorkbook导入大excel的内存消耗过大问题
方式1:使用SXSSFWorkbook ,经过测试,这个情况无效,因为本质上SXSSFWorkbook 也是通过XSSFWorkbook来的,他可以解决写出excel的场景,但是解决不了我们这种用户上传且读取excel中的内容的场景 XSSFWorkbook XSSFWorkbook = new XSSFWorkbook(fileInputStream); System.gc(); SXSSFWorkbook SXSSFWorkbook = new SXSS
继续访问
导入导出
原文地址:https://blog.csdn.net/qq_29631809/article/details/72785338 创建流程:(上级为 下级的载体) 1:.创建 工作簿 2.创建 sheet(可以创建多个) 3.创建行 4.创建单元格 接下来 分别说下 工作簿的常用三种形式的区别,他们分别是 1.HSSFWorkbook 2.XSSFWorkbook 3.SXSSFWork...
继续访问
NPOI导出Excel 65536限制
1 #region NPOI 导出excel数据超65535自动分表 2 /// <summary> 3 /// DataTable转换成Excel文档流,并输出到客户端 4 /// </summary> 5 /// <param name="table">...
继续访问
java导出csv文件 为解决导出excel时每个单元格的限制(32767)
此实现方法仅供参考 因为本人导出数据量不大所采取的方法 如数据量大,会到至内存溢出请知晓 在这还提下:导出时内容自己换行 只需在内容前尾各加双引号就行。 如图 1、准备导出工具类 // An highlighted block package com.test; import java.io.BufferedWriter; import java.io.File; import java.io...
继续访问
Excel单元格数据超过32767报错问题处理
java poi 32767
继续访问
SXSSFWorkbook Excel 大量数据导出
注意 SXSSFWorkbook 用于大量数据的导出 SXSSFWorkbook是用来生成海量excel数据文件,主要原理是借助临时存储空间生成excel, SXSSFWorkbook专门处理大数据,对于大型excel的创建且不会内存溢出的,就只SXSSFWorkbook了。 它的原理很简单,用硬盘空间换内存(就像hashmap用空间换时间一样)。 SXSSFWorkbook是streami...
继续访问
EXCEL大数据量导出的解决方案
将web页面上显示的报表导出到excel文件里是一种很常见的需求。然而,当数据量较大的情况下,excel本身的支持最多65535行数据的问题便凸显出来。下面就给出大数据量导出到excel的解决方 案。 首先,对于数据超过了65535行的问题,很自然的就会想到将整个数据分块,利用excel的多sheet页的功能,将超出65535行后的数据写入到下一个sheet页中,即通过多sheet页的方式,突破了...
继续访问
几行代码,复杂Excel 导入导出,真心强大!
点击上方蓝色字体,选择“标星公众号”优质文章,第一时间送达项目中使用:功能介绍IMPORT1、 ExcelHandle核心处理器;2、 ExcelWorkbookManageexcel所有工作表管理;3、 ExcelInitConfig配置文件初始化;4、 AbstractFileParser文件转换类;alanpoi import有何优势?1、 用户不需要额外引入poi...
继续访问
java中poi导出excel问题总结
java中poi导出excel问题总结
继续访问
java POI导出excel,列数限制在256列
有两篇文章写得比较好的 https://www.oschina.net/code/snippet_1052786_47435 https://www.jianshu.com/p/4c6eec65fdc3
继续访问
apache poi导出excel最大多少个sheet
大数据导出excel大小限制
写评论
评论
收藏
点赞
踩
分享
『柒』 JAVA编程中用Apache POI 怎么用SXSSFWorkbook对已存在的excel(.xlsx)操作进行写数据操作
public SXSSFWorkbook(XSSFWorkbookworkbook)
Construct a workbook from a template.
There are three use-cases to use
SXSSFWorkbook(XSSFWorkbook) :
Append new sheets to existing workbooks. You can open existing workbook from
a file or create on the fly with XSSF.
Append rows to existing sheets. The row number MUST be greater than
max(rownum) in the template sheet.
Use existing workbook as a template and re-use global objects such as cell
styles, formats, images, etc.
All three use cases can work in a
combination. What is not supported:
Access initial cells and rows in the template. After constructing SXSSFWorkbook(XSSFWorkbook) all internal windows are empty and SXSSFSheet.getRow(int) and SXSSFRow.getCell(int) return null.
Override existing cells and rows. The API silently allows that but the
output file is invalid and Excel cannot read it.
API文档里面有,反正就是说,使用SXSSFWorkbook附加数据到已经存在的Excel中的话就是不行的;SXSSFSheet.getRow(int) 和 SXSSFRow.getCell(int) 会返回空。
SXSSFWorkbook只能用在新创建Excel中才行。
『捌』 浅谈JAVA读写Excel的几种途径
读写Excel文件需要使用Excel类库,如Free Spire.XLS for Java.
读取Excel内容:
//创建Workbook对象
Workbookwb=newWorkbook();
//加载一个Excel文档
wb.loadFromFile("C:\Users\Administrator\Desktop\test.xlsx");
//获取第一个工作表
Worksheetsheet=wb.getWorksheets().get(0);
//遍历工作表的每一行
for(inti=1;i<sheet.getLastRow()+1;i++){
//遍历工作的每一列
for(intj=1;j<sheet.getLastColumn()+1;j++){
//输出指定单元格的数据
System.out.print(sheet.get(i,j).getText());
System.out.print(" ");
}
System.out.print(" ");
}
写入内容:
//创建Workbook对象
Workbookwb=newWorkbook();
//加载一个Excel文档
wb.loadFromFile("C:\Users\Administrator\Desktop\test.xlsx");
//获取第一个工作表
Worksheetsheet=wb.getWorksheets().get(0);
//在单元格A1写入新数据
sheet.getCellRange("A1").setText("你好");
//保存文档
wb.saveToFile("写入Excel.xlsx",ExcelVersion.Version2016);
『玖』 如何用java来打印excel
importjava.io.File;
importjxl.Workbook;
importjxl.write.Label;
importjxl.write.WritableSheet;
importjxl.write.WritableWorkbook;
/**
*Excel导出(你需要引入jxl的jar包)
*/
publicclassTest{
publicstaticvoidmain(String[]args)
{
Testtest=newTest();
test.exportExcel();
}
/**
*导出(导出到磁盘)
*/
publicvoidexportExcel(){
WritableWorkbookbook=null;
try{
//打开文件
book=Workbook.createWorkbook(newFile("D:/测试.xls"));
//生成名为"学生"的工作表,参数0表示这是第一页
WritableSheetsheet=book.createSheet("学生",0);
//指定单元格位置是第一烂激列第一行(0,0)以及单元格内容为张三
Labellabel=newLabel(0,0,"张三");
派历扮//将定义好的单元格添加到工作表中
sheet.addCell(label);
//保存数字的单元格必须使用Number的完整包路径
jxl.write.Numbernumber=newjxl.write.Number(1,0,30);
sheet.addCell(number);
//写入数据并关闭文件
book.write();
}catch(Exceptione){
System.out.println(e);
}finally{
if(book!=null){
try{
book.close();
}catch(Exceptione)尘灶{
e.printStackTrace();
}
}
}
}
}
『拾』 java jxl 导出xlsx格式的excel 以前一直用的jxl,改成poi太麻烦,工作量太大。不要告诉我改成poi
不行,jxl最新版为2.6.12仍然不支持xlsx。要不换poi,要不让用户自己转xlsx格式为xls格式。