跳转到内容

小天管理

管理员
  • 注册日期

  • 最后上线

小天管理 发表的所有内容

  1. 在平时的开发中,经常要开发 Excel 的导入导出功能。一般使用 poi 或者 EasyExcel 开发,使用 poi 做 excel 比较复杂,大部分开发都会使用 EasyExcel 因为一行代码就能实现导入和导出的功能。但是 EasyExcel 不支持图片的读的操作,本文操作如何实现图片的读和写的功能。 在 EasyExcel 官网的常见问题可以看到 EasyExcel 是不支持读取图片的功能。 读取图片 poi 读取图片 poi 支持图片的读取,使用 poi 写一个工具类,支持图片的读取,首先添加 maven 依赖, EasyExcel 含有 poi 依赖,无需额外添加 poi 依赖: <!-- easyexcel --> <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>3.0.5</version> </dependency> <dependency> <groupId>net.sf.jxls</groupId> <artifactId>jxls-core</artifactId> <version>1.0.6</version> </dependency> 读取图片核心代码如下: Workbook workbook = WorkbookFactory.create(inputStream); // 默认读取第一页 XSSFSheet sheet = (XSSFSheet) workbook.getSheetAt(0); List<POIXMLDocumentPart> documentPartList = sheet.getRelations(); for (POIXMLDocumentPart part : documentPartList) { if (part instanceof XSSFDrawing) { XSSFDrawing drawing = (XSSFDrawing) part; List<XSSFShape> shapes = drawing.getShapes(); for (XSSFShape shape : shapes) { XSSFPicture picture = (XSSFPicture) shape; XSSFClientAnchor anchor = picture.getPreferredSize(); CTMarker marker = anchor.getFrom(); int row = marker.getRow(); int col = marker.getCol(); // 从第 2 行开始 if (row > 0 && row <= size) { PictureData pictureData = picture.getPictureData(); String extension = pictureData.suggestFileExtension(); byte[] bytes = pictureData.getData(); } } } } 读取图片流程: 首先要获取第一页( sheet )数据 workbook.getSheetAt(0) 遍历 sheet.getRelations() 提取 XSSFDrawing ,也就是图片数据。 每一行遍历数据数据,获取 byte 字节流。 可能代码复制在 idea 会提示某些方法不存在,这里就需要核对 poi 版本,上面引用的 EasyExcel 的版本是 3.0.5,里面的 poi 版本是 4.1.2。 封装工具类 通过上面的代码可以获取到图片的字节流,然后对字节流做上传图片或者服务存储图片处理,但是每个读取都写一遍这种方式,代码就比较冗余了。所以就需要将上面代码封装成一个工具类。 比如上传一个文件,需要将数据赋值给两个字段 name 和 imageStr: @ExcelProperty("姓名") private String name; @ExcelProperty(value = "图片") private String imageStr; 首先配置一个 ExcelImageProperty 注解,确定哪列的图片需要赋值给对应的图片字段: @Inherited @Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) public @interface ExcelImageProperty { String[] value() default {""}; /** * 图片在第几列 1 开始 * @return */ int index() default -1; } imageStr 对应第二列,字段上 ExcelImageProperty 注解的 index = 2,上面的实体修改如下: @ExcelProperty("姓名") private String name; @ExcelProperty(value = "图片") @ExcelImageProperty(index = 2) private String imageStr; 写好实体和注解后,再写一个工具类。 @Slf4j public class ExcelReadImageUtil { public static <T> void readImage(InputStream inputStream, List<T> list) { try { Workbook workbook = WorkbookFactory.create(inputStream); // 默认读取第一页 XSSFSheet sheet = (XSSFSheet) workbook.getSheetAt(0); List<POIXMLDocumentPart> documentPartList = sheet.getRelations(); Integer size = list.size(); for (POIXMLDocumentPart part : documentPartList) { if (part instanceof XSSFDrawing) { XSSFDrawing drawing = (XSSFDrawing) part; List<XSSFShape> shapes = drawing.getShapes(); for (XSSFShape shape : shapes) { XSSFPicture picture = (XSSFPicture) shape; XSSFClientAnchor anchor = picture.getPreferredSize(); CTMarker marker = anchor.getFrom(); int row = marker.getRow(); int col = marker.getCol(); // 从第 2 行开始 if (row > 0 && row <= size) { PictureData pictureData = picture.getPictureData(); String extension = pictureData.suggestFileExtension(); byte[] bytes = pictureData.getData(); InputStream imageInputStream = new ByteArrayInputStream(bytes); //String url = iTxCosService.uploadFile(new ByteArrayInputStream(bytes), UUID.randomUUID() + "." + extension); for (int i = 0; i < size; i++) { T item = list.get(i); Class clazz = item.getClass(); Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { if (field.isAnnotationPresent(ExcelImageProperty.class)) { ExcelImageProperty excelImageProperty = field.getAnnotation(ExcelImageProperty.class); int index = excelImageProperty.index(); if (index == col + 1 && row - 1 == i) { field.setAccessible(true); field.set(item,new String(bytes)); } } } } } } } } } catch (IOException | IllegalAccessException e) { e.printStackTrace(); log.error("read image error {}",e); } } } 传参一个列表,通过获取读取输入流获取到图片,赋值给对应的字段。 此模板是一个列表模版,不支持自定义模板。 使用 poi 读取图片,第二行读取数据,遍历每列数据,符合注解字段就赋值。一般获取到输入流后会上传图片,返回一个地址,这里仅仅就获取字节流,赋值给对应的字段。 使用 EasyExcel 读取非图片数据和工具类读取图片数据: InputStream inputStream = multipartFile.getInputStream(); List<DemoExcelInput> demoExcelInputs = EasyExcelFactory.read(multipartFile.getInputStream()).head(DemoExcelInput.class).sheet().doReadSync(); ExcelReadImageUtil.readImage(inputStream,demoExcelInputs); inputStream 不能重复使用,不然会报错 inputStream close 错误。 更多内容请关注我的公众号:小码 A 梦
  2. 目前是 alist 挂载阿里后 rclone 再反代直链给 emby ,但是这几天发现限速 1m/s 了,基本没法看,手上还有几个天翼云盘,但是上传是个问题,30 兆上传小水管,20t 要上传特别久。
  3. 通过主页获取插件:mpmd 最近使用md 网页版的公众号文章 Markdown 编辑器已经有一段时间了,它提供了 Markdown 内容外链收集之外,还提供了图床集成的功能,同时这个项目是个开源项目。 虽然提供了 Github 、阿里云 OSS 、腾讯云 OSS 以及七牛云 Kodo 等图床集成功能,但是我还觉得还不太够,为何不集成微信公众号的图床(素材库)呢 因此就有了这个产物,将其改造成浏览器插件形式是目前我所能实现对接官方素材库的最好办法了,情况如此: https://mp.weixin.qq.com/s/Y12gMSHGFQLTgNihnGJukA 以下内容是 AI 自动生成的。 微信公众号图文创作利器:Markdown 编辑器 + 多平台图片托管 借助我们创新的浏览器插件,轻松创作引人入胜的微信公众号图文内容。该插件集成了功能强大的 Markdown 编辑器和主流图片托管平台,并支持使用官方微信公众号图片托管服务,让您免费存储图片,助您高效创作图文内容。 核心功能: 简易 Markdown 编辑:使用我们直观的 Markdown 编辑器,轻松创作引人入胜的微信公众号文章,其简洁易用的特点备受用户好评。 无缝图片集成:直接将图片嵌入 Markdown 内容,支持多种主流图片托管平台,操作简单便捷。 官方微信公众号图片托管:利用官方微信公众号图片托管服务免费存储图片,无需额外付费。 释放创意,轻松创作 我们的浏览器插件将 Markdown 编辑的强大功能与无缝的图片托管功能相结合,助您轻松创作引人入胜的微信公众号图文内容。无论您是经验丰富的撰稿人还是初出茅庐的内容创作者,我们的插件都能帮助您简化工作流程,激发您的创作灵感。 高效实惠,触手可及 借助我们的插件,您可以简化图文创作流程,无需使用外部图片托管服务,节省时间和金钱。利用官方微信公众号图片托管服务免费存储图片,确保高效实惠的图文创作体验。
  4. 招行又发了闪电贷的优惠券,2.9%利率,最长贷款 2 年,满足条件必得,条件是: 深圳闪电贷客户(需要走深圳的客户经理建额,已建额的可关闭重新建) 招贷分大于等于 12000 近一个月和当前时点无闪电贷 以 20w 为例,贷款一年利息: 等额本息 3156.94 按月付息,到期还本 6098.27 贷款两年利息: 等额本息 6098.27 按月付息,到期还本 9037.45 建议加客户经理咨询操作步骤: https://imgur.com/v1ee5oJ 具体信息: https://i.imgur.com/cJXvyve.jpe 使用后可领取小礼品,参考: https://v2ex.com/t/1051319
  5. Topic Sentence Generator https://www.topicsentencegenerator.com/ 第一次上站,一个主题句生成器,方便学英语的同学或者任何需要英语写作的同学快速的生成段落的主题句。 支持四大文体 例子: 关键词: What is the meaning of life 1. Argumentative Essay (议论文): What is the meaning of life has been a profound question pondered by philosophers and thinkers throughout history. 生命的意义是什么一直是哲学家和思想家们在历史上思考的一个深刻问题。 2. Narrative Essay (叙事文): In the quest to unravel the profound question of "What is the meaning of life?", each individual embarks on a unique journey of self-discovery and existential exploration. 为了解开"生命的意义是什么?"这一深刻问题,每个人都踏上了一段独特的自我发现和生存探索之旅。 3. Expository Essay (说明文): The meaning of life, a profound philosophical inquiry, encompasses various interpretations and theories that attempt to define the ultimate purpose of human existence. 生命的意义是一个深刻的哲学探究,包括各种解释和理论,试图定义人类生存的最终目的。 4. Practical Essay (实用写作): This essay explores the profound question of "What is the meaning of life?" and delves into various philosophical perspectives to uncover potential answers. 本文探讨了"生命的意义是什么?"这一深刻问题,并深入探讨了各种哲学视角,以揭示潜在的答案。
  6. 观 https://www.v2ex.com/t/1052490 有感。 这里的 GC 特指追踪( Tracing GC ,如 JVM 、Go )和引用计数(想不到例子)等一般意义上的运行时垃圾回收制,不包括 C++/Rust 等编译期确定的垃圾回收机制。 问题: 你在业务中遇到过(或预计遇到)由 GC 带来的、不能接受的性能瓶颈吗(如 STW )?你有过针对 GC 来修改代码,以优化性能的经历吗? 如果用可以避免堆分配的语言(如 Go ),你会有意选择减少堆分配的写法,来节约 GC 成本吗? 你对目前使用语言的 GC 性能满意吗? 你的业务场景下,可能会为避免 GC 的其他缺陷(例如内存颠簸)换到无 GC 语言吗?
  7. informedainews.com 是我在半个月前上线的网站,现在 pv 有 47k ,我还运营着一份网站配套的 newsletter ,目前订阅人数 150+。导航功能是新上的板块,可以给你的网站引流和加反链。 目前的提交规则也很简单: 这是导航站页面: https://informedainews.com/zh-Hans/latest-tools 这是提交工具页面: https://informedainews.com/zh-Hans/submit 将 informedainews.com 添加到您的网站页脚作为友情链接,就可以得到导航站一个免费的 dofollow 链接,还可以登上我的 newsletter 推广。 不想加友情链接的话,可以给我发一封邮件,我会给你我的微信,然后你发我 50 元红包,也可以上导航。
  8. CPU 的消息,供应链能打听到消息。意向年底的 amd 9700 或者现在的 7800x3d ;显卡想英伟达 70 或者 AMD 800xt 级别。但是苦于没有消息源,不知道新卡提升大不大,要是例行更新~10%,我就直接最近下手了。 打听 CPU 的时候,听到了一个很新的玩法:韩厂给硬盘提价,但是同时扩产。
  9. Windows 11 专业版 23H2 抖音 PC 端在完全退出的情况下,能够在通知中心弹出通知,这是怎么实现的? 看了下进程,有个 PushNotificationsLongRunningTask.exe 的进程看起来跟常驻通知有关, 把它结束掉,再重新打开抖音,发现除了抖音进程,还会启动这两个进程: DynamicDependencyLifetimeManagerShadow.exe PushNotificationsLongRunningTask.exe 这两个文件的“产品名称”都是:Windows App SDK 退出抖音,PushNotificationsLongRunningTask.exe 不会退出,还在运行
  10. 这个月开始时我订阅了 https://github.com/DIYgod/RSSHub/blob/master/lib/routes/producthunt/today.ts 每天简单地过一遍标题和简介,给我的感受是满屏的 AI: 这个月我查看的条目都在 这里 ,非推广,仅自用 此时首页 https://www.producthunt.com/ 的 Top Products Launching Today Featured 的前十个里就占七个
  11. 人麻了,刚加完班回来。。。。 估计这两周得忙死 我现在在跑业务的有五台机 一台大点的马上到期了就不续了 现在还有几套系统没搭,求推荐看看还差几台 什么配置的机,我这边一共预算就七百块钱 主要是国内访问的,但是不想要备案域名 所以想用 hk 的 还差 一个雷池,一套彩虹易支付,和一个用户面板,用户面板那边是自己开发的,日均访问量大概在 3k 左右吧(统计的最近雷池的数据) 后面可能会涨 还有一些 socket 连接 估计到下个月能有个三五百并发,现在是日均七八十并发这样,大佬们给推荐推荐怎么选机器 这个预算是一年的,或者至少半年的
  12. 如果您准备入手购买 unRAID ,或者使用 openmediavault ,不妨进来看看,或许您的需求,Debian 就能满足。 由于这里发布帖子插图困难,详细图文说明请移步下方链接。 “这是一个基于 Debian 系统搭建 HomeNAS 的玩法分享,希望能给有需要的朋友一点帮助。即使不熟悉 Linux 系统命令,也可入手。搭建及维护基本通过图形界面操作。服务均是由开源世界实力团队维护,安全且更新及时,长期使用不惧断更。这里不讨论它和其他 NAS 系统对比哪个好,因为每个人需求不一样。引用版主的话,电脑领域自成方圆,玩法多样,分享只是希望在别的朋友有需要的时候,能给出一些参考思路。大家如果有什么疑问或想了解的,可以留言跟帖,尽量解答。” 1 、详细图文说明: https://www.chiphell.com/thread-2609968-1-1.html 2 、搭建最终成果展示: https://www.bilibili.com/video/BV16w4m1m78x/?spm_id_from=333.999.0.0&vd_source=edf48b61aa8c33c32292521c6dd3b776 3 、自动化脚本配置系统演示: https://www.bilibili.com/video/BV1EU411d7PM/?spm_id_from=333.999.0.0&vd_source=edf48b61aa8c33c32292521c6dd3b776 4 、Debian 虚拟机直通硬盘安装黑群晖演示: https://www.bilibili.com/video/BV1vZ421H74n/?spm_id_from=333.999.0.0 5 、基于 Debian 搭建 HomeNAS 自动化配置脚本项目地址: https://github.com/kekylin/Debian-HomeNAS
  13. 最近做了一个 Midjourney Style Codes 样式代码库 简介:Midjourney 风格代码是用于 prompt 中快速应用特定视觉风格的特殊标识符。它们允许用户在不编写冗长详细提示的情况下创建风格一致的图像。要在 Midjourney 中使用风格代码,在 prompt 中的任意位置包含“--sref”后跟代码编号。 我收集整理了 Midjourney 风格代码,随时了解当前最热门的内容。 1.网站完全免费使用 2.提供一键复制 Midjourney 风格代码 3.在详情页中看到完整大图以及 prompt 网站在这里: https://srefhunter.top 大家觉得还有什么功能需要完善的,欢迎反馈~
  14. 背景 我目前有一个 Kafka 集群,包含两个 Kafka 服务器,它们共享同一个 Zookeeper 。集群中有两个主题:corpnet-requests 和 corpnet-responses ,这两个主题都有 3 个 partition 。 系统中有四个客户端: Client A 和 Client B:订阅两个 Kafka 服务器上的 corpnet-requests 和 corpnet-responses 主题。这两个客户端负责生产包含 guid 、url 、payload 和 auth 的消息到 corpnet-requests 主题。 Client C 和 Client D:同样订阅两个 Kafka 服务器上的 corpnet-requests 和 corpnet-responses 主题。这两个客户端负责消费 corpnet-requests 主题中的消息,执行实际的 HTTP 请求,并将响应结果生产到 corpnet-responses 主题中。 Client A 和 Client B:除了生产请求消息外,还需要消费 corpnet-responses 主题中的消息,以获取实际的 HTTP 响应,完成一次请求的逻辑。 以上设计主要用于解决 Client A 和 B 无法访问公司内网资源的问题,公司内网无法通过 vpn 访问。 问题描述 由于 corpnet-requests 和 corpnet-responses 主题都有多个分区,我担心会出现以下冲突情况: Client A生产的请求消息的响应(由Client C 或 Client D生成)可能会被Client B消费,反之亦然。 我的疑问 请教各位大佬如何确保每个请求的响应能够准确地返回给发起请求的客户端(即Client A的请求响应不会被Client B消费,反之亦然)。似乎通过 key 来限制 partition 或者规划消费者组都无法保证,当然也有可能是我学艺不精理解有误。。 欢迎大家提供解决方案或建议,谢谢!
  15. 站点:Ouroboros 网址: https://blog.pursuitus.com RSS: https://blog.pursuitus.com/feed 简介:游记、个人生活、小白数字技术探索
  16. 刚查了一下,.com 域名,国外都 150 以上,国内 85 ,这是弄啥咧?
  17. 搜了下,站内好像没人反映这个问题。 去年双 11 在京东买的二代,这才半年时间就没办法充电了,无论是原装线还是第三方都没反应。还没有联系售后,准备周末再去。 现在苹果的外设品控这么差了吗?
  18. 走 AirPlay 主要是为了让接 Mac 的书架箱发声,画面还是想在 iPad 端播放。谢谢。
  19. 601 分,位次 12000 左右,只想报计算机相关专业,也准备好了进入学校再转专业到计算机科学,上大学主要就是为了念完本科找工作 综合自己看了下之前的帖子和今年的分数线,个人分数能去的是中末流 211 或者双非,可以的话请 v2exer 们推荐下你们觉得不错的这两种学校,谢谢喵
  20. 家里使用的移动宽带光猫之前是桥接模式,但是今天不知道怎么了突然不能拨号了。 打电话给 10086 说我的账号是正常的没有问题。再打给给我们小区运维宽带的师傅师傅说现在移动要加强对光猫的管控,不能在光猫上使用桥接模式了,只能使用路由模式。 有没有在无锡的小伙伴遇到同样的情况啊?
  21. 现状:手上负责管理 N 多项目,涉及到不同的部门,每个项目涉及到名称、资金、不同阶段的时间、附件等等信息,目前是通过 Excel 表格管理,定期让不同的部门更新。另外还要管理施工人员、证书、荣誉等信息,也是 Excel 表。 问题:1 是 Excel 表格经不同人发来发去版本容易乱 2 是不方便筛选、统计。 需求:想通过信息系统管理起来,但又觉得这些功能很通用,不希望定制开发。有没有这样一种开源系统,自行添加管理对象(项目、证书),以及每类对象的属性也可以自定义(名字、资金、时间、附件),再提供各种筛选、统计等。最好能够轻量级一点,可以在单机直接部署、支持 SQLite 最好。
  22. 比如在部署 elk stack, prometheus stack 的时候,挑得我都眼花了,不知道该用哪个好了 之前挑来挑去,最后还是自己写了 k8s manifest ,没整太多花里胡哨的,但是费时间...
  23. 用过几个无线鼠标,都会有在使用中突然无法移动,大概一分钟内恢复的情况,非常影响使用体验。 这种是无线连接的设备太多吗?桌面上无线的设备有鼠标、键盘、屏幕挂灯、连 WiFi 的台灯这些,应该也不算多吧。 各位除了有线之外,有没有解决了断连这个问题的鼠标推荐?