<摘自>飞:jxl简析[ http://www.emlog.net/fei ]

本文介绍了Java操作Excel的jxl库,包括其主要API及其应用。详细解析了jxl库的工作簿、工作表、单元格等概念,并探讨了如何通过jxl库进行Excel文件的读取和写入。

<摘自>飞:jxl简析:http://www.emlog.net/fei

最近,完成了一个网上报表系统,刚巧用到了一个 JAVA 操作 excel 表格的 API .闲来无事,就将其大概的总结了一下.现阶段 JAVA 操作 Excel 的 JAR 主要有 apache 的 POI 及 jxl. 因为现在的 eclipse 操作 excel 用的插件为 jxl ,所以在项目中就使用了 jxl .想想两者都差不了太多.此简单系列为两个部分,一是 API 系列,另一部分则是应用系列.

一、 API 系列

       Jxl 的 API 主要有三个包, jxl,jxl.format,jxl.write .如果单独的分析 API ,可能对于更明确的了解此 API 没有太多的帮助,我们还是从 Excel 文件的层次来剥离此 API 吧.

一个 excel 文件由一个工作簿组成,一个工作簿又由 n 个工作表组成.每个工作表又由多个单元格组成.对应于 Jxl 中的结构为

读文件(包 jxl )

写文件 ( 包 jxl.write)

说明

Workbook  

WritableWorkbook

工作簿

Sheet

WritableSheet

工作表

Cell/Image/Hyperlink

WritableCell/WritableImage//WritableHyperlink

单元格 / 图像 / 超链接

         单元格(此处指文本单元格,图像及链接和单元格做为一个层次)分为好多种,所以在 API 的设计中将 Cell 作为一个接口而存在.

       对应的 jxl 中的结构为:

读文件(包 jxl )

写文件 ( 包 jxl.write)

说明

Cell

WritableCell

单元格

BooleanCell

Boolean

布尔值单元格

DateCell

DateTime

时间单元格

ErrorCell

 

形式错误的单元格

LabelCell

Label

文本单元格

NumberCell

Number

数字单元格

FormualCedll

Formual

公式单元格

 

Blank

空格单元格

BooleanFormualCell

 

布尔公式单元格

DateFormualCell

 

时间公式单元格

ErrorFormualCell

 

错误公式单元格

StringFormualCell

 

文本公式单元格

NumberFormualCell

 

数字公式单元格

 

而有的时候,我们可能将几个单元格作为一个整体来处理,在 API 中对应的则是:

    jxl.Range  

    虽然数据是电子表格的核心,但是同时其也需要一些辅助类 比如文件格式设置,工作表设置与显示效果.单元格设置与显示效果等.按照其层次,则依次有以下接口或类.

 

读文件(包 jxl )

写文件 ( 包 jxl.write)

说明

WorkbookSettings

WorkbookSettings (包 jxl )

设置 workbook 属性的 bean

SheetSettings

SheetSettings (包 jxl )

设置具体 sheet 的属性的 bean (比如表头表底等)

HeaderFooter

HeaderFooter (包 jxl )

表示表头表底类

HeaderFooter.Contents

HeaderFooter.Contents (包 jxl )

具体表头表底设置

CellFeatures

WritableCellFeautres

表格内容相关设置(验证)

CellReferenceHelper

 

得到引用单元格相关属性

CellType

 

表格相关类型

CellView

CellView (包 jxl )

表格视图相关设置

CellFormat

WritableCellFormat

表格显示样式设置

 

BoldStyle

边框枚举

 

DateFormat

时间格式

 

DateFormats

时间格式枚举

 

NumbreFormat

数据格式

 

NumbreFormats

数字模式枚举

 

WritableFont

字体设置

 

WriteableFont.Fontname

静态字体内部类

 

最后,关于 Jxl.format 包.此包主要是一些与具体样式有关的接口和枚举.不进行具体描述.第一部分完.

set home JAVA_HOME=/bea/jdk1.8.0_411 PATH=/bea/jdk1.8.0_411/jre/bin:/bea/jdk1.8.0_411/bin:/usr/bin:/bin CLASSPATH=.:/data/getDaliCpn/Application/classes:/data/getDaliCpn/Config:/data/getDaliCpn/Application/lib/activation.jar:/data/getDaliCpn/Application/lib/classes12.jar:/data/getDaliCpn/Application/lib/commons-beanutils-1.6.1.jar:/data/getDaliCpn/Application/lib/commons-codec-1.9.jar:/data/getDaliCpn/Application/lib/commons-collections-2.1.jar:/data/getDaliCpn/Application/lib/commons-digester-1.5.jar:/data/getDaliCpn/Application/lib/commons-digester.jar:/data/getDaliCpn/Application/lib/commons-httpclient-3.0.jar:/data/getDaliCpn/Application/lib/commons-httpclient-3.1.jar:/data/getDaliCpn/Application/lib/commons-jexl-1.0.jar:/data/getDaliCpn/Application/lib/commons-lang-2.6.jar:/data/getDaliCpn/Application/lib/commons-lang3-3.9.jar:/data/getDaliCpn/Application/lib/commons-logging.jar:/data/getDaliCpn/Application/lib/db_util.jar:/data/getDaliCpn/Application/lib/dom4j.jar:/data/getDaliCpn/Application/lib/ews-java-api-2.0.jar:/data/getDaliCpn/Application/lib/excelutils.jar:/data/getDaliCpn/Application/lib/freemarker-2.3.3.jar:/data/getDaliCpn/Application/lib/ftp.jar:/data/getDaliCpn/Application/lib/httpclient-4.5.jar:/data/getDaliCpn/Application/lib/httpcore-4.4.1.jar:/data/getDaliCpn/Application/lib/javacsv-2.0.jar:/data/getDaliCpn/Application/lib/joda-time-2.8.jar:/data/getDaliCpn/Application/lib/jsoup-1.15.4.jar:/data/getDaliCpn/Application/lib/jxl.jar:/data/getDaliCpn/Application/lib/jxls-core-0.9.3-SNAPSHOT.jar:/data/getDaliCpn/Application/lib/jxls-reader-0.9.3-SNAPSHOT.jar:/data/getDaliCpn/Application/lib/log4j-1.2.8.jar:/data/getDaliCpn/Application/lib/mail.jar:/data/getDaliCpn/Application/lib/ofbcore-entity.jar:/data/getDaliCpn/Application/lib/ofbcore-service.jar:/data/getDaliCpn/Application/lib/ofbcore-share.jar:/data/getDaliCpn/Application/lib/poi-3.12-sources.jar:/data/getDaliCpn/Application/lib/poi-ooxml-3.12-sources.jar:/data/getDaliCpn/Application/lib/poi-ooxml-schemas-3.12.jar:/data/getDaliCpn/Application/lib/poi-ooxml-3.12.jar:/data/getDaliCpn/Application/lib/poi-3.12.jar:/data/getDaliCpn/Application/lib/smics-sap.jar:/data/getDaliCpn/Application/lib/spire.xls-5.1.5.jar:/data/getDaliCpn/Application/lib/xmlbeans-2.3.0.jar System environment has been set. Start running program at 2025/12/11 18:35:03. moduleName:SJ_CUST_MAIL_IN log4j:WARN No appenders could be found for logger (com.smics.apps.textfileprocessor.service.TextFileProcessorService). log4j:WARN Please initialize the log4j system properly. fieldLengthInt-&gt;[1] 【MV1】 OM9067S1A1.BT DPS需求4500013389制令单-MA0931A3-FPAH-251211-SJ-60086EA4500013389制令单-MA0931A3-FPAH-251211-SJ-60086EA.xlsx java.io.FileNotFoundException: /data/EnterpriseApp/FtpFiles/QILIANSHAN/NEWFTWO/4500013389制令单-MA0931A3-FPAH-251211-SJ-60086EA.xlsx (File name too long) at java.io.FileOutputStream.open0(Native Method) at java.io.FileOutputStream.open(FileOutputStream.java:270) at java.io.FileOutputStream.&lt;init&gt;(FileOutputStream.java:213) at java.io.FileOutputStream.&lt;init&gt;(FileOutputStream.java:162) at microsoft.exchange.webservices.data.property.complex.FileAttachment.load(FileAttachment.java:233) at com.smics.apps.textfileprocessor.service.DaliShipmentCpnService.getCustMail(DaliShipmentCpnService.java:2032) at com.smics.apps.textfileprocessor.service.TextFileProcessorService.startFileProcess(TextFileProcessorService.java:227) at com.smics.apps.textfileprocessor.jsms.jobClient.main(jobClient.java:25) WO_AB1_20251211-90_ENGWO_AB1_20251211-90_ENG.XLSX 2178 [main] INFO service.TextFileProcessorService - READ SJ_CUST_MAIL_IN end
最新发布
12-13
&lt;think&gt;根据用户的问题,需要解决两个主要问题: 1. log4j未初始化警告:WARN No appenders could be found for logger 2. 文件名称过长导致的FileNotFoundException: File name too long 结合引用的内容,特别是引用[4]提到了log4j的警告,引用[2]和引用[3]提到了FileNotFoundException,我们可以综合给出解决方案。 ### 问题1: log4j未初始化警告 引用[4]中提到了`No appenders could be found for logger`的警告。这通常是因为log4j没有正确配置,无法找到日志输出器(appender)。解决方法包括: - 确保在类路径(classpath)中有一个log4j的配置文件(如log4j.properties或log4j.xml)。 - 配置文件中需要定义至少一个appender和一个root logger。 例如,一个简单的log4j.properties文件内容如下: ``` log4j.rootLogger=DEBUG, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d [%t] %-5p %c - %m%n ``` 如果已经存在配置文件,需要检查文件路径是否正确,并且确保在程序启动时能够被加载。可以通过设置系统属性来指定配置文件的位置,例如: ```java System.setProperty("log4j.configuration", "file:/path/to/your/log4j.properties"); ``` 另外,引用[4]中提到了添加Java启动参数来设置扩展目录,但这里更关键的是确保配置文件被正确加载。 ### 问题2: FileNotFoundException: File name too long 这个错误通常是因为文件路径(包括目录和文件名)的长度超过了操作系统的限制。在Windows系统中,路径长度限制通常是260个字符(MAX_PATH),而在Unix-like系统中则通常更长,但也可能有限制。 解决方法: 1. **缩短文件路径**:将文件移动到更浅的目录层次中,或者缩短文件名。 2. **使用相对路径**:尽量使用相对路径而不是绝对路径,因为绝对路径往往较长。 3. **在Windows上启用长路径支持**(如果适用): - 在Windows 10及以上版本,可以启用长路径支持。具体方法: - 打开组策略编辑器(gpedit.msc) - 依次选择:计算机配置 -&gt; 管理模板 -&gt; 系统 -&gt; 文件系统 - 启用“启用Win32长路径” - 或者修改注册表:在`HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem`下,将`LongPathsEnabled`设置为1。 4. **使用Java的NIO.2 API**:Java 7及以上版本引入了`java.nio.file`包,可以支持更长的路径。例如: ```java Path path = Paths.get("your/very/long/path"); Files.createDirectories(path); // 创建目录 Files.write(path.resolve("filename"), data); // 写文件 ``` 使用NIO.2 API可以绕过操作系统的路径长度限制,因为它会自动处理长路径(在Windows上会使用`\\\\?\\`前缀)。 ### 综合解决方案 1. 对于log4j警告,检查并配置log4j,确保配置文件被正确加载。 2. 对于文件名过长的问题: - 首先尝试缩短路径或文件名。 - 如果无法缩短,考虑启用操作系统的长路径支持(如果是Windows)。 - 在代码中使用NIO.2 API来操作文件。 ### 示例代码片段(使用NIO.2) ```java import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; public class FileExample { public static void main(String[] args) { try { // 使用NIO.2创建长路径 Path longPath = Paths.get("a", "very", "long", "path", "that", "exceeds", "the", "normal", "length", "limit"); Files.createDirectories(longPath); Path file = longPath.resolve("myfile.txt"); Files.write(file, "Hello, World!".getBytes()); } catch (Exception e) { e.printStackTrace(); } } } ``` §§相关问题§§ 1. 如何在Java中配置log4j以避免未初始化警告? 2. Java中如何处理文件路径过长的问题? 3. 在Windows系统上如何启用长路径支持? 4. Java NIO.2相比传统的FileIO有什么优势? &lt;/think&gt; ### 解决 log4j 未初始化警告和文件路径过长问题 #### 一、log4j 未初始化警告解决方案 **问题现象**: 日志输出 `WARN No appenders could be found for logger`,表明 log4j 未找到有效的日志输出配置[^4]。 **解决步骤**: 1. **添加配置文件** 在 `src/main/resources` 下创建 `log4j.properties` 文件,基础配置示例: ```properties log4j.rootLogger=INFO, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n ``` 2. **检查依赖** 确保 Maven 包含 log4j 依赖(以 log4j 1.x 为例): ```xml &lt;dependency&gt; &lt;groupId&gt;log4j&lt;/groupId&gt; &lt;artifactId&gt;log4j&lt;/artifactId&gt; &lt;version&gt;1.2.17&lt;/version&gt; &lt;/dependency&gt; ``` 3. **指定配置文件路径** 若配置文件不在默认路径,启动时需显式指定: ```bash java -Dlog4j.configuration=file:/path/to/log4j.properties -jar your_app.jar ``` #### 二、文件路径过长错误解决方案 **问题现象**: `java.io.FileNotFoundException: File name too long` 通常发生在路径超过系统限制(如 Windows 的 260 字符限制)[^2][^3]。 **解决步骤**: 1. **缩短文件路径** - 移动文件到更浅的目录(如 `C:\project` 代替嵌套目录) - 使用短文件名(8.3 格式),例如: ```java File file = new File("C:\\PROJ~1\\data.txt"); // 短路径格式 ``` 2. **启用长路径支持(Windows)** - **方法1**:注册表修改 路径:`HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem` 添加 `DWORD` 值 `LongPathsEnabled = 1` - **方法2**:组策略修改 启用:`计算机配置 &gt; 管理模板 &gt; 系统 &gt; 文件系统 &gt; 启用 Win32 长路径` 3. **使用 Java NIO.2 API** 通过 `java.nio.file` 绕过路径长度限制: ```java Path path = Paths.get("\\\\?\\C:\\very\\long\\path\\file.txt"); // Windows 前缀 Files.write(path, "data".getBytes()); ``` 4. **优化临时文件处理** 若涉及临时文件(如引用[2]的 `AppData\Local\Temp` 问题): ```java // 使用系统临时目录并缩短文件名 File tempFile = File.createTempFile("tmp_", ".dat", new File("C:\\short_path")); ``` #### 三、综合建议 1. **路径长度检查工具** 使用此方法在运行时验证路径: ```java Path path = Paths.get("your/file/path"); if (path.toString().length() &gt; 240) { // 预留系统前缀空间 throw new RuntimeException("Path exceeds limit: " + path); } ``` 2. **日志系统初始化验证** 在程序入口添加检查: ```java import org.apache.log4j.Logger; public class Main { static { if (!Logger.getRootLogger().getAllAppenders().hasMoreElements()) { System.err.println("Log4j not configured!"); } } } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值