kmp desktop实现excel预览
先将excel转paf
https://blog.csdn.net/qq_42761569/article/details/121699594
package utilimport com.aspose.cells.License
import com.aspose.cells.PdfSaveOptions
import com.aspose.cells.Workbook
import com.geolo.desktop.common.utils.LogUtils
import java.io.FileOutputStreamobject ExcelUtils {/*** excel 转 pdf** @param excelFilePath excel文件路径* @param convertSheets 需要转换的sheet*/fun excel2pdf(excelFilePath: String, convertSheets: IntArray?) {excel2pdf(excelFilePath, null, convertSheets)}/*** excel 转 pdf** @param excelFilePath excel文件路径* @param pdfFilePath pdf文件路径* @param convertSheets 需要转换的sheet*//*** excel 转 pdf** @param excelFilePath excel文件路径*//*** excel 转 pdf** @param excelFilePath excel文件路径* @param pdfFilePath pdf文件路径*/@JvmOverloadsfun excel2pdf(excelFilePath: String,pdfFilePath: String? = null,convertSheets: IntArray? = null) {var pdfFilePath = pdfFilePathtry {pdfFilePath = pdfFilePath ?: getPdfFilePath(excelFilePath)// 验证 Licenselicenseval wb = Workbook(excelFilePath)val fileOS = FileOutputStream(pdfFilePath)val pdfSaveOptions = PdfSaveOptions()pdfSaveOptions.onePagePerSheet = trueif (null != convertSheets) {printSheetPage(wb, convertSheets)}wb.save(fileOS, pdfSaveOptions)fileOS.flush()fileOS.close()LogUtils.d("Excel convert success")} catch (e: Exception) {LogUtils.d("Excel convert failed")e.printStackTrace()}}/*** 获取 生成的 pdf 文件路径,默认与源文件同一目录** @param excelFilePath excel文件* @return 生成的 pdf 文件*/private fun getPdfFilePath(excelFilePath: String): String {return excelFilePath.split(".".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()[0] + ".pdf"}private val license: Unit/*** 获取 license 去除水印* 若不验证则转化出的pdf文档会有水印产生*/get() {val licenseFilePath = "excel-license.xml"try {val `is` = ExcelUtils::class.java.classLoader.getResourceAsStream(licenseFilePath)val license = License()license.setLicense(`is`)} catch (e: Exception) {LogUtils.d("license verify failed")e.printStackTrace()}}/*** 隐藏workbook中不需要的sheet页。** @param sheets 显示页的sheet数组*/private fun printSheetPage(wb: Workbook, sheets: IntArray?) {for (i in 1 until wb.worksheets.count) {wb.worksheets[i].isVisible = false}if (null == sheets || sheets.size == 0) {wb.worksheets[0].isVisible = true} else {for (i in sheets.indices) {wb.worksheets[i].isVisible = true}}}
}
适用于window平台的desktop应用破的 pff预览view
https://github.com/Patr1ick/fxPDF?tab=readme-ov-file
预览控件
package ui.pdfpreviewimport androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberUpdatedState
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.awt.SwingPanel
import com.geolo.desktop.common.utils.LogUtils
import eu.patrickgeiger.fxpdf.util.PDF
import eu.patrickgeiger.fxpdf.viewer.MinimalViewer
import javafx.application.Platform
import javafx.embed.swing.JFXPanel
import javafx.scene.Scene
import javafx.scene.layout.StackPane
import java.io.File@Composable
fun PdfPreview(state: PdfPreviewState,modifier: Modifier = Modifier,onCreated: (MinimalViewer) -> Unit = {},onDispose: (MinimalViewer) -> Unit = {},
) {var minimalViewer by remember { mutableStateOf<MinimalViewer?>(null) }val currentOnDispose by rememberUpdatedState(onDispose)minimalViewer?.let {DisposableEffect(it) {onDispose {it.pdf.closeDocument() //关闭文档currentOnDispose(it)}}}SwingPanel(factory = {JFXPanel().also { jfxP ->Platform.runLater {val rootVewView = MinimalViewer.MinimalViewerBuilder().setPDF(PDF(File(state.filePath))).build()minimalViewer = rootVewViewval root = StackPane()root.children.add(minimalViewer)val scene = Scene(root)onCreated.invoke(rootVewView)jfxP.scene = scenePlatform.enterNestedEventLoop("main") //退出后可重新进入}}}, modifier = modifier) {jfxpannel->}}class PdfPreviewState(val filePath: String
)
相关文章:
kmp desktop实现excel预览
先将excel转paf https://blog.csdn.net/qq_42761569/article/details/121699594 package utilimport com.aspose.cells.License import com.aspose.cells.PdfSaveOptions import com.aspose.cells.Workbook import com.geolo.desktop.common.utils.LogUtils import java.io.Fi…...
OB_GINS_day3
这里写目录标题 实现当前状态初始化实现预积分的初始化由于此时preintegration_options 是3(也就是考虑odo以及earth rotation)为预积分的容器添加需要积分的IMU积分因子接下来是添加新的IMU到preintegration中 实现当前状态初始化 这个state_curr的主要…...
【Python3】【力扣题】405. 数字转换为十六进制数
【力扣题】题目描述: 题意理解:(不允许使用库函数) 数字等于0,则结果为0, 数字小于0,则补码运算,即最高位(32位)为1,其余全部取反,再加…...
记录一次企业外部通过ssh 连接数据库的事DBeaver
情况大概是这样,公司算法供应商开通了连接某个服务器A的权限,但是数据库x是在另一台服务器B上。 直接通过外部连接数据库是不行的,需要借用服务器A来进行访问x 使用软件:DBeaver, 数据库x类型:oracle 需要的信息&am…...
中聚企服:中聚AI女娲大模型,企业难题迎刃而解!
在这个瞬息万变的商业世界里,企业面临的挑战愈发复杂多样。小到日常文书和规章制度,大到工商财税和知识产权保护,每一个环节都至关重要。为了帮助中小企业在激烈的市场竞争中脱颖而出,中聚企服在官方小程序重磅上线了一款革命性产…...
对镜像精简
dive工具,用来优化镜像大小 ENV命令合并 ENV DEBUG_PORT8777 \HTTP_PORT12080 \PROGRAM_FILE_HOME_UPORTAL_CONF/home/zenap/uportal/confWORKDIR usr/src/app,会切换到这个目录 使用COPY --chown 修改属主,不要使用RUN chown 容器内非root…...
老电脑不能装纯净版windows
手上有一台2016年的老笔记本电脑,用了8年,基本上能换的都换了一遍,散热风扇换了,键盘换了,屏幕换了,扬声器也换了,内存也换大了,甚至都换过固态硬盘,但是CPU没法换&#…...
在Python中实现一个简单的社交媒体应用
在Python中实现一个简单的社交媒体应用 社交媒体应用是现代互联网的重要组成部分,允许用户分享信息、交流和互动。在这篇博文中,我们将使用Python构建一个简单的社交媒体应用,涵盖用户注册、发布动态、评论和查看动态等基本功能。我们将使用Flask框架作为后端,SQLite作为数…...
pytest高版本兼容test_data[“log“] = _handle_ansi(“\n“.join(logs))错误
一、问题现象: 执行seleniumpytest结束时报: INTERNALERROR> File "D:\workspace\pytestframe\.venv\Lib\site-packages\pytest_html\report_data.py", line 141, in add_test INTERNALERROR> test_data["log"] _handle_ansi(&q…...
Redis技术入门与实践指南
一、Redis基础知识 1、概念 Redis是一个开源的、遵循BSD协议的、基于内存的而且目前比较流行的键值数据库(key-value database),是一个非关系型数据库,redis 提供将内存通过网络远程共享的一种服务,提供类似功能的 还有memcached࿰…...
如何一键完成20个Oracle实例运维脚本部署
在日常的运维工作中,常常是一个人需要管理维护数个数十个数据库实例,如果是开源类集群如mysql,PG等可能更多;在没有商业的集中管理平台的情况下,如何快速的部署监控或者运维脚本,是一个值得探讨的问题&…...
【C++刷题】力扣-#598-区间加法 II
题目描述 给你一个 m x n 的矩阵 M和一个操作数组 op 。矩阵初始化时所有的单元格都为 0 。ops[i] [ai, bi] 意味着当所有的 0 < x < ai 和 0 < y < bi 时, M[x][y] 应该加 1。 在 执行完所有操作后 ,计算并返回 矩阵中最大整数的个数 。 示…...
优雅的LUA数据记录方法-serpent序列化+LUA Table
目录 简述如何集成?如何使用序列化 反序列化 参考 简述 项目里需要使用LUA脚本将数据记录到文件,要方便的增加、查找、删除,要方便的加载与存回。 使用序列化/反序列化 lua table可以很容易实现这些功能。 序列化将table转换为字符串 反序列…...
初始JavaEE篇——多线程(4):wait、notify,饿汉模式,懒汉模式,指令重排序
找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏:JavaEE 目录 wait、notify 方法 多线程练习 单例模式 饿汉模式 懒汉模式 指令重排序 wait、notify 方法 wait 和 我们前面学习的sleep…...
Apache Solr 身份认证绕过导致任意文件读取漏洞复现(CVE-2024-45216)
0x01 产品简介 Apache Solr是一个开源的搜索平台,基于流行的Apache Lucene库构建。它提供了一个强大的全文搜索功能,能够快速处理大量数据,并支持复杂的搜索操作。并且是一个独立的企业级搜索应用服务器,它采用Java开发,并基于Apache Lucene实现。Solr提供了类似于Web-Se…...
C#整合Ollama实现本地LLMs调用
前言 近两年AIGC发展的非常迅速,从刚开始的只有ChatGPT到现在的很百家争鸣。从开始的大参数模型,再到后来的小参数模型,从一开始单一的文本模型到现在的多模态模型等等。随着一起进步的不仅仅是模型的多样化,还有模型的使用方式。…...
C++基于opencv的视频质量检测--图像抖动检测
文章目录 0.引言1. 原始代码分析2. 优化方案3. 优化后的代码4. 代码详细解读 0.引言 视频质量图像抖动检测已在C基于opencv4的视频质量检测中有所介绍,本文将详细介绍其优化版本。 1. 原始代码分析 首先,我们来看图像抖动检测的原始代码: …...
Cuda By Example - 11 (Texture Memory 2-D)
跟1D一样,2D的代码也没有运行过。旧的方法看看就好。 声明二维Texture texture<float, 2> texConstSrc; texture<float, 2> texIn; texture<float, 2> texOut; 访问二维Texture 使用2D的Texture的便利性体现在blend_kernel函数里。不再需要通…...
Go匿名结构体使用场景
1. 定义 在 Go 语言中,匿名结构体(Anonymous Struct)是一种没有显式命名的结构体类型。你可以直接在代码中定义并使用匿名结构体,而不需要为其定义一个单独的类型名称。匿名结构体通常用于临时数据结构或一次性使用的场景。 匿名…...
Vue 发布十年了!你知道我这十年是怎么过的吗?
2014 年 2 月 3 日,Vue 在 Hacker News 上首次亮相。十年后的今天,Vue 已经成为使用最广泛的前端框架之一,拥有了一个非常丰富的生态系统。本文来梳理一下 Vue.js 十年以来的重要里程碑! 尤雨溪,无疑是 Vue.js 背后的灵…...
OpenClaw+Qwen2.5-VL-7B:3类图文数据分析自动化案例
OpenClawQwen2.5-VL-7B:3类图文数据分析自动化案例 1. 为什么需要本地化的图文数据分析助手? 上周我整理季度运营报告时,面对几十张散落的截图和PDF,突然意识到一个问题:我们花在"找数据-复制粘贴-核对格式&quo…...
otp:Go语言一次性密码库入门指南 - 5分钟快速上手双因素认证
otp:Go语言一次性密码库入门指南 - 5分钟快速上手双因素认证 【免费下载链接】otp TOTP library for Go 项目地址: https://gitcode.com/gh_mirrors/otp/otp 在当今网络安全威胁日益严峻的环境下,一次性密码(OTP)已成为保护…...
CUDA12.4环境适配:OpenClaw调用Qwen3-14B镜像的驱动配置详解
CUDA12.4环境适配:OpenClaw调用Qwen3-14B镜像的驱动配置详解 1. 为什么需要关注CUDA环境适配 上周我在本地部署Qwen3-14B镜像时,遇到了一个典型问题:模型加载到一半突然崩溃,控制台只留下一行模糊的CUDA错误提示。经过两天排查才…...
OpenClaw安全实践:Qwen3.5-9B本地化部署防数据泄露方案
OpenClaw安全实践:Qwen3.5-9B本地化部署防数据泄露方案 1. 为什么需要关注OpenClaw的安全问题? 去年冬天,我在整理公司财报时突然意识到一个问题:如果让AI助手帮我处理这些敏感文件,数据会不会被意外上传到云端&…...
基于Python的毕业生实习管理系统
项目介绍:基于Python的毕业生实习管理系统技术栈 项目编号:本课题采用 Python 语言进行开发,系统整体基于 Web 平台实现。前端页面主要使用 HTML、CSS、JavaScript 进行构建,并结合 Bootstrap 提升页面布局与交互效果;…...
技术创业中的风险管理:从内核开发到商业稳定
技术创业中的风险管理:从内核开发到商业稳定 技术创业的风险挑战 作为一名从Linux内核开发者转型产品经理再到科技创业者的人,我深刻体会到风险管理在技术创业中的重要性。技术创业过程中充满了各种风险,从技术风险到商业风险,从市…...
STM32大棚花卉物联网护养系统设计与实现
1. 项目概述这个大棚花卉护养系统是我去年为一个花卉种植基地设计的物联网解决方案。当时客户反映传统人工管理方式效率低下,经常出现浇水不及时、温度控制不精准等问题。经过三个月的开发和调试,这套系统成功将花卉产量提升了30%,同时减少了…...
基于单片机的心率及跌倒检测系统设计(有完整资料)
资料查找方式:特纳斯电子(电子校园网):搜索下面编号即可编号:T4192205M设计简介:本设计是基于单片机的心率及跌倒检测系统,主要实现以下功能:1、可通过心率模块检测当前的心率 2、可…...
基于S7-200控制的自动洗车系统 本设计包括设计报告,PLC组态仿真,I/O接口,带注释程序...
基于S7-200控制的自动洗车系统 本设计包括设计报告,PLC组态仿真,I/O接口,带注释程序pdf版,接线图,控制电路图,主电路图,PLC接线图,顺序功能图 总体设计 系统有自动和手动模式,选择手…...
BD663474车载LCD驱动芯片技术解析与CARIAD集成实践
1. BD663474驱动芯片技术解析:面向CARIAD车载显示系统的TFT-LCD底层控制实现BD663474是ROHM半导体推出的一款专为汽车级TFT-LCD面板设计的源极驱动(Source Driver)与栅极驱动(Gate Driver)集成控制器,广泛应…...
