帮我写个java程序,要求使用多线程将100w行数据写入一个xlsx文件的一个sheet页中
时间: 2023-05-25 15:05:04 浏览: 569
POITest:测试添加到 .xlsx 1000 行
以下是一个Java程序,使用多线程将100W行数据写入一个xlsx文件的一个sheet页中。
```
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileOutputStream;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class MultiThreadWriteExcel {
private static final int ROW_NUM = 1000000;
public static void main(String[] args) {
// 创建xlsx文件
XSSFWorkbook workbook = new XSSFWorkbook();
// 创建一个sheet页
Sheet sheet = workbook.createSheet("Sheet1");
// 设置表头
Row headerRow = sheet.createRow(0);
Cell headerCell1 = headerRow.createCell(0);
headerCell1.setCellValue("序号");
Cell headerCell2 = headerRow.createCell(1);
headerCell2.setCellValue("姓名");
Cell headerCell3 = headerRow.createCell(2);
headerCell3.setCellValue("年龄");
Cell headerCell4 = headerRow.createCell(3);
headerCell4.setCellValue("性别");
// 设置表头样式
XSSFFont font = workbook.createFont();
font.setBold(true);
XSSFCellStyle style = workbook.createCellStyle();
style.setFont(font);
for (int i = 0; i < 4; i++) {
headerRow.getCell(i).setCellStyle(style);
}
// 创建线程池
ExecutorService pool = Executors.newFixedThreadPool(10);
int start = 1;
int end = ROW_NUM;
int threadNum = 10;
int interval = ROW_NUM / threadNum;
for (int i = 0; i < threadNum; i++) {
if (i == threadNum - 1) {
end = ROW_NUM;
} else {
end = start + interval - 1;
}
final int startIndex = start;
final int endIndex = end;
pool.submit(() -> {
for (int j = startIndex; j <= endIndex; j++) {
Row row = sheet.createRow(j);
Cell cell1 = row.createCell(0);
cell1.setCellValue(j);
Cell cell2 = row.createCell(1);
cell2.setCellValue("姓名" + j);
Cell cell3 = row.createCell(2);
cell3.setCellValue(18 + j % 10);
Cell cell4 = row.createCell(3);
cell4.setCellValue(j % 2 == 0 ? "男" : "女");
}
});
start = end + 1;
}
// 关闭线程池
pool.shutdown();
// 保存Excel文件
try (FileOutputStream outputStream = new FileOutputStream("multi-thread-write-excel.xlsx")) {
workbook.write(outputStream);
outputStream.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
}
```
该程序创建了一个100W行的xlsx文件,并使用线程池将数据写入文件中。程序使用`ExecutorService`创建线程池,通过循环划分每个线程要处理的数据范围,并将任务提交到线程池中进行处理。
在每个线程中,使用`Sheet`的`createRow`方法创建行,并使用`Row`的`createCell`方法创建单元格,然后使用`Cell`的`setCellValue`方法设置单元格的值。在程序中示例中,设置了4列数据:序号、姓名、年龄和性别。要注意的是,程序并没有实际使用姓名、年龄和性别这些数据,而是使用了简单的循环来生成数据。在实际项目中,需要根据具体需求进行修改。
最后,使用`FileOutputStream`将工作簿写入文件,并在文件写入完成后关闭`FileOutputStream`。
如果程序运行顺利,将会在程序所在的目录下生成一个名为`multi-thread-write-excel.xlsx`的Excel文件,其中包含100W行数据。
阅读全文