关于sheet线程安全问题

- (void)beginSheet:(NSWindow *)sheet modalForWindow:(NSWindow *)docWindow modalDelegate:(id)modalDelegate didEndSelector:(SEL)didEndSelector contextInfo:(void *)contextInfo

上面函数只能在主线程运行,在后台线程运行可能会有意想不到的异常。


同样,NSBeginSheet也一样。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用Java多线程导出多个sheet页的Excel示例,带有代码注释: ```java import java.io.FileOutputStream; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFFont; 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.ss.usermodel.HorizontalAlignment; public class ExcelExportService { // 定义线程池 private ExecutorService executorService; // 定义导出数据列表 private List<List<Object[]>> dataList = new ArrayList<>(); // 定义每个sheet页的标题 private List<String> sheetTitles = new ArrayList<>(); // 构造函数,初始化线程池 public ExcelExportService(int threadCount) { executorService = Executors.newFixedThreadPool(threadCount); } // 添加导出数据 public void addData(List<Object[]> data, String sheetTitle) { dataList.add(data); sheetTitles.add(sheetTitle); } // 导出Excel文件 public void exportExcel(String filePath) throws Exception { // 创建工作簿 HSSFWorkbook workbook = new HSSFWorkbook(); // 创建样式 HSSFCellStyle cellStyle = workbook.createCellStyle(); cellStyle.setAlignment(HorizontalAlignment.CENTER); // 居中对齐 // 创建字体 HSSFFont font = workbook.createFont(); font.setBold(true); // 加粗 cellStyle.setFont(font); // 循环生成每个sheet页 for (int i = 0; i < dataList.size(); i++) { final int sheetIndex = i; executorService.execute(new Runnable() { @Override public void run() { // 创建sheet页 HSSFSheet sheet = workbook.createSheet(sheetTitles.get(sheetIndex)); // 获取数据 List<Object[]> data = dataList.get(sheetIndex); // 循环生成每行数据 for (int rowIndex = 0; rowIndex < data.size(); rowIndex++) { Object[] rowData = data.get(rowIndex); HSSFRow row = sheet.createRow(rowIndex); // 循环生成每个单元格 for (int cellIndex = 0; cellIndex < rowData.length; cellIndex++) { row.createCell(cellIndex).setCellValue(rowData[cellIndex].toString()); } } // 设置标题行样式 sheet.getRow(0).setRowStyle(cellStyle); } }); } // 等待所有线程执行完毕 executorService.shutdown(); while (!executorService.isTerminated()) { Thread.sleep(100); } // 写入文件 FileOutputStream fos = new FileOutputStream(filePath); workbook.write(fos); fos.close(); } } ``` 使用方法: ```java // 创建导出服务 ExcelExportService exportService = new ExcelExportService(10); // 创建10个线程的线程池 // 添加导出数据 List<Object[]> data1 = new ArrayList<>(); data1.add(new Object[] {"姓名", "年龄", "性别"}); data1.add(new Object[] {"张三", 18, "男"}); exportService.addData(data1, "学生"); List<Object[]> data2 = new ArrayList<>(); data2.add(new Object[] {"名称", "价格", "库存"}); data2.add(new Object[] {"手机", 1999, 50}); exportService.addData(data2, "商品"); // 导出Excel文件 exportService.exportExcel("D:\\test.xls"); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值