搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
小小林熬夜学编程
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
HDFS常用命令_hdfs get命令
2
【C语言/数据结构】栈:从概念到两种存储结构的实现
3
基于springboot+vue的汽车租赁管理系统,附源码+数据库+论文+PPT,适合课程设计、毕业设计_车辆租赁管理系统数据库
4
Android OpenCV实现人脸检测(一)完成人脸检测功能_android opencv做小区门禁人脸识别
5
.NET开源、功能强大、跨平台的图表库
6
Linux 进程间通信——消息队列_linux消息队列
7
PDF控件Spire.PDF for .NET【安全】演示:使用文本或/和图像对 PDF 进行数字签名
8
C++ ─── 匿名对象+变量的创建顺序
9
前端实现录音
10
求第k大数_求第k大数的时间复杂度nlogn
当前位置:
article
> 正文
JAVA 操作Excle解决方案_workbook.createsheet()报 cannot evaluate java.awt.f
作者:小小林熬夜学编程 | 2024-05-20 08:03:50
赞
踩
workbook.createsheet()报 cannot evaluate java.awt.font.tostring()
前不久公司的一个项目里要用到Excel报表功能,因项目组中的兄弟都没搞过这个东西,所以走了不少弯路。现总结一下JAVA操作Excel的解决方案与大家分亨,有不正确的地方请高手指正。
JAVA操作Excel目前流行的技术有:
1: javascript;
2: Apache的poi;
3: jxl;
4: Jfreechart(与其它几种配合使用)
一:报表结构较简单且格式固定 这类报表建议创建模版,用poi/jxl/javascript读取模版里的内容,然后生成新的Excel文件(POI在读取文件和生成新文件过程中会丢失公式,必须在生成的新文件里重写公式),POI读取示例代码如下:
public
class
ReadModelDemo {
public
static
void
createExcelFromTemplate
()
{
//
读取模板
Excel
HSSFWorkbook workBook =
null
;
try
{
workBook =
new
HSSFWorkbook(
new
FileInputStream(
"C://model.xls"
));
}
catch
(FileNotFoundException e) {
//
TODO
Auto-generated catch block
e.printStackTrace();
}
catch
(IOException e) {
//
TODO
Auto-generated catch block
e.printStackTrace();
}
//
得到这个
workbook
模版后
,
就可以插入数据了
//......
workBook.createSheet().createRow(6).createCell((
short
)2).setCellValue(15);
//......
try
{
//
新建一输出文件流
FileOutputStream out =
new
FileOutputStream(
"C://test.xls"
);
//
把相应的
Excel
工作簿存盘
workBook.write(out);
out.flush();
out.close();
}
catch
(Exception e) {
e.printStackTrace();
}
}
}
二
报表结构不确定且复杂(带分析图)
这类报表建议用
poi/javascript
写数据部分,分析图可以用
jfreechart
来画,画完后插入到
excel
中(
poi 3.0
以后支持图片插入)以下示例为
POI
写数据和格式的部分,
jfreechart
生成图片及插入到
Excel
的代码略:
import
java.io.FileOutputStream;
import
org.apache.poi.hssf.record.ChartRecord;
import
org.apache.poi.hssf.record.FormulaRecord;
import
org.apache.poi.hssf.usermodel.HSSFCell;
import
org.apache.poi.hssf.usermodel.HSSFCellStyle;
import
org.apache.poi.hssf.usermodel.HSSFChart;
import
org.apache.poi.hssf.usermodel.HSSFDataFormat;
import
org.apache.poi.hssf.usermodel.HSSFFont;
import
org.apache.poi.hssf.usermodel.HSSFRichTextString;
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.hssf.util.Region;
public
class
CreateExcelDemo {
/**
*
@param
args
*/
public
static
void
main(String[] args) {
HSSFWorkbook workbook =
new
HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet();
HSSFRow row = sheet.createRow(0);
HSSFCell cell = row.createCell((
short
)0);
//
表名样式
HSSFCellStyle titlecellstyle = workbook.createCellStyle();
titlecellstyle.setAlignment(HSSFCellStyle.
ALIGN_LEFT
);
//
左对齐
HSSFFont titleFont = workbook.createFont();
titleFont.setBoldweight(HSSFFont.
BOLDWEIGHT_BOLD
);
//
粗体
titleFont.setUnderline(HSSFFont.
U_SINGLE
);
//
单下画线
titleFont.setFontName(
"Arial"
);
//
字体
titleFont.setFontHeightInPoints((
short
)14);
//
大小
titlecellstyle.setFont(titleFont);
//
表头样式
HSSFCellStyle formTitleStyle = workbook.createCellStyle();
formTitleStyle.setAlignment(HSSFCellStyle.
ALIGN_CENTER
);
formTitleStyle.setBorderBottom(HSSFCellStyle.
BORDER_THIN
);
formTitleStyle.setBorderLeft(HSSFCellStyle.
BORDER_THIN
);
formTitleStyle.setBorderRight(HSSFCellStyle.
BORDER_THIN
);
formTitleStyle.setBorderTop(HSSFCellStyle.
BORDER_THIN
);
HSSFFont formTitleFont = workbook.createFont();
formTitleFont.setBoldweight(HSSFFont.
BOLDWEIGHT_BOLD
);
formTitleFont.setFontName(
"Arial"
);
titleFont.setFontHeightInPoints((
short
)10);
formTitleStyle.setFont(formTitleFont);
//
表内容样式
HSSFCellStyle contentStyle = workbook.createCellStyle();
contentStyle.setAlignment(HSSFCellStyle.
ALIGN_CENTER
);
contentStyle.setBorderBottom(HSSFCellStyle.
BORDER_THIN
);
contentStyle.setBorderLeft(HSSFCellStyle.
BORDER_THIN
);
contentStyle.setBorderRight(HSSFCellStyle.
BORDER_THIN
);
contentStyle.setBorderTop(HSSFCellStyle.
BORDER_THIN
);
contentStyle.setAlignment(HSSFCellStyle.
ALIGN_CENTER
);
HSSFFont contentFont = workbook.createFont();
contentFont.setFontName(
"Arial"
);
contentFont.setFontHeightInPoints((
short
)12);
contentStyle.setFont(contentFont);
//
百分数显示样式
HSSFCellStyle percentStyle = workbook.createCellStyle();
percentStyle.setAlignment(HSSFCellStyle.
ALIGN_CENTER
);
percentStyle.setBorderBottom(HSSFCellStyle.
BORDER_THIN
);
percentStyle.setBorderLeft(HSSFCellStyle.
BORDER_THIN
);
percentStyle.setBorderRight(HSSFCellStyle.
BORDER_THIN
);
percentStyle.setBorderTop(HSSFCellStyle.
BORDER_THIN
);
percentStyle.setAlignment(HSSFCellStyle.
ALIGN_CENTER
);
percentStyle.setDataFormat((
short
)9);
percentStyle.setAlignment(HSSFCellStyle.
ALIGN_CENTER
);
HSSFFont percentFont = workbook.createFont();
percentFont.setFontName(
"Arial"
);
percentStyle.setFont(percentFont);
//
写入内容
cell.setCellStyle(titlecellstyle);
cell.
setCellValue
(
"PII-ENG
采购申请流程控制分析报告
"
);
row = sheet.createRow((
short
)1);
row = sheet.createRow((
short
)2);
cell = row.createCell((
short
)0);
cell.
setCellValue
(
"
报告日期:
2007-10-25
(月报)
"
);
row = sheet.createRow((
short
)3);
HSSFRichTextString str1 =
new
HSSFRichTextString(
"
作业标准:
(1) HKD0-10
万
(14
日
)
;
"
+
"(2) HKD10
万
-50
万
(14
日
)
;
(3) >=HKD50
万
(37
日
)
;
(4)
豁免申请
(37
日
)"
);
HSSFRichTextString str2 =
new
HSSFRichTextString(
"
指标:
作业标准内完成数量
/
总数量
>=80%"
);
row.createCell((
short
)0).setCellValue(str1);
sheet.createRow((
short
)4).createCell((
short
)0).setCellValue(str2);
row=sheet.createRow((
short
)5);
cell = row.createCell((
short
)0);
cell.setCellStyle(formTitleStyle);
cell.setCellValue(
new
HSSFRichTextString(
"
时段
"
));
cell = row.createCell((
short
)1);
cell.setCellStyle(formTitleStyle);
cell.setCellValue(
new
HSSFRichTextString(
"HKD0-10
万
"
));
cell = row.createCell((
short
)4);
cell.setCellStyle(formTitleStyle);
cell.setCellValue(
new
HSSFRichTextString(
"HKD10
万
-50
万
"
));
cell = row.createCell((
short
)7);
cell.setCellStyle(formTitleStyle);
cell.setCellValue(
new
HSSFRichTextString(
">HKD50
万
"
));
cell = row.createCell((
short
)10);
cell.setCellStyle(formTitleStyle);
cell.setCellValue(
new
HSSFRichTextString(
"
豁免申请
"
));
cell = row.createCell((
short
)13);
cell.setCellStyle(formTitleStyle);
cell.setCellValue(
new
HSSFRichTextString(
"
当月合计
"
));
cell = row.createCell((
short
)17);
cell.setCellStyle(formTitleStyle);
cell.setCellValue(
new
HSSFRichTextString(
"
指标
"
));
row = sheet.createRow((
short
)6);
cell = row.createCell((
short
)1);
cell.setCellStyle(formTitleStyle);
cell.setCellValue(
new
HSSFRichTextString(
"<=14
日
"
));
cell = row.createCell((
short
)2);
cell.setCellStyle(formTitleStyle);
cell.setCellValue(
new
HSSFRichTextString(
">14
日
"
));
cell = row.createCell((
short
)3);
cell.setCellStyle(formTitleStyle);
cell.setCellValue(
new
HSSFRichTextString(
"
达标率
"
));
cell = row.createCell((
short
)4);
cell.setCellStyle(formTitleStyle);
cell.setCellValue(
new
HSSFRichTextString(
"<=14
日
"
));
cell = row.createCell((
short
)5);
cell.setCellStyle(formTitleStyle);
cell.setCellValue(
new
HSSFRichTextString(
">14
日
"
));
cell = row.createCell((
short
)6);
cell.setCellStyle(formTitleStyle);
cell.setCellValue(
new
HSSFRichTextString(
"
达标率
"
));
cell = row.createCell((
short
)7);
cell.setCellStyle(formTitleStyle);
cell.setCellValue(
new
HSSFRichTextString(
"<=37
日
"
));
cell = row.createCell((
short
)8);
cell.setCellStyle(formTitleStyle);
cell.setCellValue(
new
HSSFRichTextString(
">37
日
"
));
cell = row.createCell((
short
)9);
cell.setCellStyle(formTitleStyle);
cell.setCellValue(
new
HSSFRichTextString(
"
达标率
"
));
cell = row.createCell((
short
)10);
cell.setCellStyle(formTitleStyle);
cell.setCellValue(
new
HSSFRichTextString(
"<=37
日
"
));
cell = row.createCell((
short
)11);
cell.setCellStyle(formTitleStyle);
cell.setCellValue(
new
HSSFRichTextString(
">37
日
"
));
cell = row.createCell((
short
)12);
cell.setCellStyle(formTitleStyle);
cell.setCellValue(
new
HSSFRichTextString(
"
达标率
"
));
cell = row.createCell((
short
)13);
cell.setCellStyle(formTitleStyle);
cell.setCellValue(
new
HSSFRichTextString(
"
达标数
"
));
cell = row.createCell((
short
)14);
cell.setCellStyle(formTitleStyle);
cell.setCellValue(
new
HSSFRichTextString(
"
不达标数
"
));
cell = row.createCell((
short
)15);
cell.setCellStyle(formTitleStyle);
cell.setCellValue(
new
HSSFRichTextString(
"
合计
"
));
cell = row.createCell((
short
)16);
cell.setCellStyle(formTitleStyle);
cell.setCellValue(
new
HSSFRichTextString(
"
合计达标率
"
));
//
合并单元格
sheet.addMergedRegion(
new
Region(5,(
short
)0,6,(
short
)0));
sheet.addMergedRegion(
new
Region(5,(
short
)1,5,(
short
)3));
sheet.addMergedRegion(
new
Region(5,(
short
)4,5,(
short
)6));
sheet.addMergedRegion(
new
Region(5,(
short
)7,5,(
short
)9));
sheet.addMergedRegion(
new
Region(5,(
short
)10,5,(
short
)12));
sheet.addMergedRegion(
new
Region(5,(
short
)13,5,(
short
)16));
sheet.addMergedRegion(
new
Region(5,(
short
)17,6,(
short
)17));
//
加入数据,设置公式
row = sheet.createRow((
short
)7);
cell = row.createCell((
short
)0);
cell.setCellStyle(contentStyle);
cell.setCellValue(
new
HSSFRichTextString(
"1
月
"
));
cell = row.createCell((
short
)1);
cell.setCellStyle(contentStyle);
cell.setCellValue(256);
cell = row.createCell((
short
)2);
cell.setCellStyle(contentStyle);
cell.setCellValue(1);
cell = row.createCell((
short
)3);
cell.setCellStyle(percentStyle);
cell.setCellFormula(
"B8/(B8+C8)"
);
cell = row.createCell((
short
)4);
cell.setCellStyle(contentStyle);
cell.setCellValue(3);
cell = row.createCell((
short
)5);
cell.setCellStyle(contentStyle);
cell.setCellValue(5);
cell = row.createCell((
short
)6);
cell.setCellStyle(percentStyle);
cell.setCellFormula(
"E8/(E8+F8)"
);
cell = row.createCell((
short
)7);
cell.setCellStyle(contentStyle);
cell.setCellValue(0);
cell = row.createCell((
short
)8);
cell.setCellStyle(contentStyle);
cell.setCellValue(5);
cell = row.createCell((
short
)9);
cell.setCellStyle(percentStyle);
cell.setCellFormula(
"H8/(H8+I8)"
);
cell = row.createCell((
short
)10);
cell.setCellStyle(contentStyle);
cell.setCellValue(2);
cell = row.createCell((
short
)11);
cell.setCellStyle(contentStyle);
cell.setCellValue(0);
cell = row.createCell((
short
)12);
cell.setCellStyle(percentStyle);
cell.setCellFormula(
"K8/(K8+L8)"
);
cell = row.createCell((
short
)13);
cell.setCellStyle(contentStyle);
cell.setCellFormula(
"sum(b8+e8+h8+k8)"
);
cell = row.createCell((
short
)14);
cell.setCellStyle(contentStyle);
cell.setCellFormula(
"sum(c8+f8+i8+l8)"
);
cell = row.createCell((
short
)15);
cell.setCellStyle(contentStyle);
cell.setCellFormula(
"sum(n8+o8)"
);
cell = row.createCell((
short
)16);
cell.setCellFormula(
"n8/p8"
);
cell.setCellStyle(percentStyle);
cell = row.createCell((
short
)17);
cell.setCellValue(0.8);
cell.setCellStyle(percentStyle);
//HSSFChart chart = new HSSFChart();
//chart.createBarChart(workbook, sheet);
ChartRecord chart =
new
ChartRecord();
chart.setHeight(200);
chart.setWidth(400);
chart.setX(20);
chart.setY(20);
try
{
FileOutputStream fileOut =
new
FileOutputStream(
"C://test.xls"
);
workbook.write(fileOut);
fileOut.close();
}
catch
(Exception e) {
System.
out
.println(e.toString());
}
}
}
三 以下方法生成的分析图与数据是分离的,当数据区的值改变时,分析图是不会随之改变的,如果要一起改变,就只能全部用无所不能的javascript来Excel了。以下为简单示例:
<HTML>
<BODY>
<script lanage="javascript">
function CreateExcel()
{
var exceldemo = new ActiveXObject("Excel.Application");
exceldemo.Visible = true;
var workbook = exceldemo.Workbooks.Add();
var sheet = workbook.ActiveSheet;
sheet.Cells(1,1).Value = "1月";
sheet.Cells(2,1).Value = "2月";
sheet.Cells(3,1).Value = "3月";
sheet.Cells(4,1).Value = "4月";
sheet.Cells(1,2).Value = "120";
sheet.Cells(2,2).Value = "250";
sheet.Cells(3,2).Value = "310";
sheet.Cells(4,2).Value = "80";
exceldemo.Visible = true;
exceldemo.UserControl = true;
oResizeRange = sheet.Range("B1:B4");
var chart = sheet.Parent.Charts.Add();
chart.ChartWizard(oResizeRange, -4100, null, 2);
chart.SeriesCollection(1).XValues = sheet.Range("A1","A4");
chart.SeriesCollection(1).Name = '月报';
chart.Location(2, sheet.Name);
sheet.Shapes("Chart 1").Top = sheet.Rows(10).Top;
sheet.Shapes("Chart 1").Left = sheet.Columns(2).Left;
}
</SCRIPT>
<P><INPUT id=button1 type=button value="生成excel" οnclick="CreateExcel()"></P>
</BODY>
</HTML>
个人觉得Apache和sun公司在对word和Excel的支持上做得不是很理想,虽然有一个poi和jxl,但使用起来还不如javascript 方便,更要命的是poi和jxl都不支持在Excel中画分析图。要画图的地方只能用模版或者是用jfreechart来画。如果谁有更好的解决方案,请一起交流交流。
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/596856
推荐阅读
article
动态
规划
之
背包
问题
(
java
)全面
总结
_
java
背包
问题
解析...
全面
总结
动态
规划
之
背包
问题
,
java
,蓝桥杯,算法,
动态
规划
,多种
背包
问题
总结
;
背包
问题
优化;01
背包
;完全
背包
;多重背...
赞
踩
article
minio
的
基本
使用
——
java
_
minio
java
...
简单介绍了
minio
的
使用
,演示了在
java
项目中
的
使用
案例。_
minio
java
minio
java
...
赞
踩
article
java
jar
包|介绍|
压缩
|
解压
|
常用命令
_
jar
-
xvf
解压
到指定
目录
...
一.概念JAR文件全程是Java Archive File,就是
java
档案文件。通常JAR文件就是一种
压缩
文件,与常见...
赞
踩
article
Java
Jar
包
压缩
、解压
使用指南
...
image什么是jar
包
JAR(
Java
Archive)是
Java
的归档文件,它是一种与平台无关的文件格式,它允许将许...
赞
踩
article
Java
:
Jar
包
反编译
,解压和压缩_
java
jar
包
反编译
...
JAR 文件就是
Java
Archive (
Java
档案文件),它是
Java
的一种文档格式。 JAR 文件非常...
赞
踩
article
Java
EE 初阶篇-深入了解
Junit
单元测试
框架
和
Java
中的
反射
机制(使用
反射
做
一个
简...
可以用来对方法进行测试,它是第三方公司开源出来的(很多开发工具已经集成了
Junit
框架
,比如 IDEA)优点:1)可...
赞
踩
article
Java
【
数据结构
】
哈希
(
Hash
超详解)
Hash
Set&
Hash
Map
【
神装】...
哈希
桶机制通过将冲突的元素组织在一起,而非直接覆盖,保证了
哈希
表的灵活性和高效性。它允许
哈希
表在面对大量数据时仍能保持较...
赞
踩
article
jenkins
:无法连接
仓库
:
Command
“
git
ls-
remote
-h --
https
:...
方案2:无法设置
仓库
是公开的,那就需要在
jenkins
中配置
仓库
的密钥了,这个暂时不会,后续在补充 TODO。我在创建j...
赞
踩
article
卷王
!一款基于 Web
的
调查
问卷
软件,使用
Java
和
Spring
框架
开发
,
功能强大
(已开源...
这是我见过
的
最好
的
JAVA
问卷
考试
系统,作者绝对是个
卷王
!_
卷王
问卷
考试
页面嵌入
卷王
问卷
考试
页面嵌入 ...
赞
踩
article
remote
: HTTP Basic: Access
denied
. The
provided
pa...
remote
: HTTP Basic: Access
denied
. The
provided
passw
or
d
or
...
赞
踩
article
07. 【
Java
教程】
Java
集成
开发
环境
-
IntelliJ
IDEA
...
IDE 即的缩写,中文意为
集成
开发
环境
,是用于提供程序
开发
环境
的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界...
赞
踩
article
【2024
华为
OD
机试
C
卷】409、
传递
悄悄话
|
机试
真题+思路参考+代码解析(
C
语言
、
C
++
、J...
题目描述>给定一个二叉树,每个节点上站着一个人,节点数字表示父节点到该节点
传递
悄悄话
需要花费的时间。> 初始时,根节点所...
赞
踩
article
华为
OD
机试
Java
【
悄悄话
】...
首先构建二叉树,然后深度优先搜索遍历每个节点,递归地将父节点的时延累加到其各个子节点上,并计算每个节点上的人接收到
悄悄话
...
赞
踩
article
【
华为
OD机考 统一考试
机试
C卷】
悄悄话
(
Java
题解)_
华为
od
机试
java
【
悄悄话
】...
给定一个二叉树,每个节点上站一个人,节点数字表示父节点到该节点传递
悄悄话
需要花费的时间。_
华为
od
机试
java
【悄悄...
赞
踩
article
华为
OD机试-传递
悄悄话
(
Java
&Python&Go)
100%
通过率_
华为
od
机试传递
悄悄话
...
华为
od
机考题目,
100%
通过率_
华为
od
机试传递
悄悄话
华为
od
机试传递
悄悄话
&n...
赞
踩
article
华为
OD
机试
-
二叉树
层序
遍历
(
Java
)_
华为
机试
java
二叉树
的
遍历
...
现有两组字母,分别表示后序
遍历
(左孩子->右孩子->父节点)和中序
遍历
(左孩子->父节点->右孩子)的结果,请你输出层序...
赞
踩
article
【
Harmony
OS】【
JAVA
UI】webView
动画
加载资源加载
动画
交互_
webview
.s...
ebView
动画
加载资源加载
动画
交互_
webview
.
setwebagent
webview
.
setwebagent
...
赞
踩
article
【
JAVA
UI】
HarmonyOS
Glide
简单
使用
_
鸿蒙
glide
使用
...
Glid包括一个灵活的API,允许开发人员插入几乎任何网络堆栈。默认情况下,Glid
使用
基于HttpUrlConnect...
赞
踩
article
阿里
通义
千问
API(
Java
)使用教程,基于
Springboot
后端_
springboot
接入
通义
千...
这里controller层并未将前端的请求数据传入给
api
中的参数,有需求的可以自己加一下,这里就使用浏览器测试一下看是...
赞
踩
article
【
Java
】IO
流
:
字节
流
字符
流
缓冲
流
...
流
”是一个抽象的概念,是对输入输出设备的一种抽象理解,在
Java
中,对数据的输入输出都是以“
流
”的的方式进行的。这个例子...
赞
踩
相关标签
动态规划
java
算法
蓝桥杯
开发语言
jar
jvm
java-ee
junit
单元测试
udp
哈希算法
数据结构
hash
hash table
Map
Set
jenkins
git
运维
工具
项目
开源
源码