guanquan.wang

Results 227 comments of guanquan.wang

你发的文件是改动过后的吧,我没有看到乱序。乱序大部分情况是出现了未知的标签导致的兼容性错误,用office打开后再保存Office会删除或修正这部分信息所以再次读就不会有问题,如果要解决问题我需要原件分析是那些标签并做兼容处理

EEC不支持多线程读写,它是线程不安全的,内部很多设计都是内存共享的,如果数据量较大需要异步操作可以先将行数据转为对象或者Map后再异步处理逻辑,或者直接使用流式处理[参考WIKI](https://github.com/wangguanquan/eec/wiki/2-%E8%AF%BB%E5%8F%96Excel) ``` try (ExcelReader reader = ExcelReader.read(Paths.get("./goods.xlsx"))) { List batch = new ArrayList(100); for (Iterator ite = reader.sheet(0).dataIterator(); ite.hasNext(); ) { // 行数据转对象 batch.add(ite.next().to(Goods.class)); // 使用 to 方法将共享的row转为独立的对象,这样就不会互相影响了 // 满100条批量上架...

升级到0.5.x解决此问题

我在网上查了一下有挺多这种场景,出问题应该是Paths.get(comPath + "/MO样例1.pcap.xlsx")这一句,你可以尝试独立出这一句来执行并验证,我并没有这样的环境所以无法给出准确的解决办法,以下解决方法可以逐一尝试 1. 避免使用Paths创建中文路程径,首先Workbook使用无参构造函数,其次将`wb.writeTo(Paths.get(comPath));`改为`wb.writeTo(new File(comPath + "/" + fileName));` 2. 避免创建本地文件,将workbook直接写入输出流`wb.writeTo(new FileOutputStream(comPath + "/" + fileName));`

方法2是HTTP下载后中文无法被识别吗?如果是这样的话可以设置Response头来解决,直接使用以下代码测试一下 ``` @RequestMapping("/download") public void download(HttpServletRequest request, HttpServletResponse response) throws IOException { String fileName = java.net.URLEncoder.encode("MO样例1.pcap.xlsx", "UTF-8"); response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + fileName + "\"; filename*=utf-8''" + fileName); new Workbook().addSheet(new EmptySheet()).writeTo(response.getOutputStream());...

应该是最初的写法引起误解了,方法2直接写到输出流是为了规避将中文文件名写到本地上,所以直接写入response。你可以尝试一下上面的完整示例代码看一下是否能正常。 即便正常也会有一定问题,上面示例代码只支持同步下载,数据量大的话可能会造成前端页面假死,异步下载的话可以将文件名进行编码或者用ID代替,下载的时候使用这个编码或ID找到实际文件名,然后使用上面的方法直接下载即可。

https://github.com/wangguanquan/eec/wiki/4-%E9%9D%99%E6%80%81%E8%AE%BE%E7%BD%AE%E6%A0%B7%E5%BC%8F

以下是示例代码,参照上图设置的样式 ``` @Test public void test() throws IOException { Workbook workbook = new Workbook(); Styles styles = workbook.getStyles(); // 将字体和填充预先添加到样式表(这里也可以不添加,实例化Column时再处理也可以) int fontYahei20Red = styles.addFont(new Font("微软雅黑", 20, Color.RED)); int fontYahei20Black =...

EEC只具备底层操作Excel的能力,不包含任何的业务逻辑,不过可以简单封装来达到这个效果,以下是示例代码 1. 提前检查数据是否合规,如果全部合规就执行导入,如果有一条不合规就提前中断并创建Excel 2. 使用TemplateSheet模板工作表做为输出源,这样可以最大限度保留原始文件样式 3. 检查数据行并按需修改“字体”,“填充色”以及tooltips 麻烦的地方是修改样式,这部分代码可以提出公共方法来处理,不合规样式固定的话可以写死 ``` @Test public void testDataCheck() throws IOException { try (ExcelReader reader = ExcelReader.read(Paths.get("./students.xlsx"))) { // 提前检查数据是否合规(任意一条不合规就中断) boolean invalid = reader.sheet(0).dataRows().map(row -> row.too(Student.class)).anyMatch(e...

![导入并检查](https://github.com/user-attachments/assets/97c09cbf-6a19-455d-badf-1f6c3b3d9db0)