会出现的问题:
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.junit.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.io.File;
import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
/**
* @Auther: wdq
* @Date: 2020/11/22 16:33
* @Description:
*/
@SpringBootTest
public class OnebookTests {
/**
* 测试读取excel并操作excel
* 测试excel -> zip
* @throws IOException
*/
@Test
public void testZip() throws IOException {
// copy文件到zip输出流中
byte[] buf = new byte[1024];
int cnt = 1,len;
FileOutputStream out = new FileOutputStream("D:\\test_zip.zip");
ZipOutputStream zos = new ZipOutputStream(out);
// 1、读取模板--模板图在下面,可以自己画一个
FileInputStream fileIn = new FileInputStream("D:\\test.xls");
// 获取excel对象
HSSFWorkbook wb = new HSSFWorkbook(fileIn);
// 读取第一个sheet页
HSSFSheet sheet = wb.getSheetAt(0);
// 模拟循环10次,压缩10个excel到压缩包里面
for (int i = 0; i < 10; i++) {
// 2、填写数据
// 获取第1行,第1列的单元格,然后填写数据
// 一个excel有多个sheet
// 一个sheet有多个row
// 一个row有多个cell
// HSSFRow row = sheet.getRow(0);
// HSSFCell cell = row.getCell(0);
// cell.setCellValue("【2020】年【"+(cnt)+"】月");
// 下面这一行与上面三行等价
sheet.getRow(0).getCell(0).setCellValue( "【2020】年【"+(cnt)+"】月" );
// 3、保存到输出流
ByteArrayOutputStream fileOut = new ByteArrayOutputStream();
wb.write(fileOut);
// 4、输出流转换成输入流
byte[] content = fileOut.toByteArray();
ByteArrayInputStream is = new ByteArrayInputStream(content);
BufferedInputStream in = new BufferedInputStream(is);
// 5、放到压缩流--填写待文件的名称
zos.putNextEntry(new ZipEntry("test-wdq"+(cnt++)+".xls"));
while ((len = in.read(buf)) != -1) {
zos.write(buf, 0, len);
}
// 关闭流的顺序不能变,遵从"先开后关"的原则
// 关闭流的顺序不对,会导致压缩包的文件损坏
zos.flush();
fileOut.close();
zos.closeEntry();
}
// 关闭流的顺序不能变,遵从"先开后关"的原则
wb.close();
zos.close();
out.close();
}
}