Fork me on GitHub

矩阵运算

矩阵运算

矩阵

矩阵的建立

矩阵对的建立一般采用直接创建法

注意:

  • 输入矩阵时要以“[ ]”为其标识符号,矩阵的所有元素必须都在括号内。
  • 矩阵同行元素之间由空格(个数不限)或逗号分隔,行与行之间用分号或者回车键分隔
  • 矩阵的大小不需要预先定义
  • 矩阵元素可以是运算表达式
  • 若“[ ]”中无元素,表示空矩阵
  • 如果不想显示中间结果,可以用”;”结束
  • MATLAB允许方括号里还有方括号

矩阵的生成

矩阵的生成两种方式:1.自己手打2.引入文件中的矩阵

引入文件中矩阵的方法:通过load 文件名.格式 可以创建矩阵

注意:这里的文件一定要在MATLAB运行文件中,要不然识别不了

几种创建特殊矩阵的方法

函数 含义
eye(n) 创建nxn单位矩阵
eye(m,n) 创建mxn的单位矩阵
eye(size(A)) 创建与A维度相同的单位阵
ones(n) 创建nxn全1矩阵
ones(m,n) 创建mxn全1矩阵
zeros(m,n) 创建mxn全0矩阵
zeros(size(A)) 创建与A维度相同全0矩阵
rand(m) 在[0,1]区间内创建一个nxn均匀分布的随机矩阵
rand(mxn) 在[0,1]区间内创建一个mxn均匀分布的随机矩阵
函数 含义
rand(size(A)) 在[0,1]区间内创建一个与A维度相同的均匀分布的随机矩阵
compan(P) 创建系数向量是P的多项式的伴随矩阵
diag(V) 创建一个以V中元素为主对角线的矩阵
hilb(n) 创建一个nxn的Hilbet矩阵
magic(n) 生成n阶魔方矩阵
sparse(A) 将矩阵A转化为系数矩阵

矩阵元素的运算

矩阵元素的修改

命令名 说明
D=[A;B C] A为原矩阵,B、C中包含要扩充的元素,D为扩充后的矩阵
A(m,:)=[] 删除A的第m行
A(:,n)=[] 删除A的第n列
A(m,n) = a;A(m,:)=[a,b,…,n];A(:,n)=[a,b,c,…,n] 对A的第m行n列的元素赋值;对A的第m行赋值;对A的第n列赋值

矩阵的变维

矩阵变维可以使用变维符号”:”,也可以使用reshape函数

reshape(X,m,n):表示将已知的矩阵X变成m行n列的矩阵

矩阵的变向

命令名 说明
rot(90) 将A逆时针方向旋转90°
rot(90,k) 将A逆时针方向旋转90°*k
fliplr(X) 将X左右翻转
flipud(X) 将X上下翻转
flipdim(X,dim) dim=1时,对行翻转‘当dim=2时,对列翻转

矩阵的抽取

命令名 说明
diag(X,k) 抽取矩阵X的第k条对角线上的元素向量。当k=0时是主对角线;当k>0抽取主对角线上边的;当k<0时抽取主对角线下边的
diag(X) 抽取主对角线
diag(v,k) 使v为所得矩阵第k条对角线上的元素向量
diag(v) 是v为所得矩阵主对角线上的元素向量
tril(X) 提取矩阵X的主下三角部分
tril(X,k) 提取矩阵X的第k条对角线下面的部分(包括第k条对角线)
triu(X) 提取矩阵X的主上三角部分
triu(X,k) 提取矩阵X的第k条对角线上面的部分(包括第k条对角线)

matlab程序设计

matlab程序设计

matlab的关系操作符和逻辑操作符与C语言的一致,就不再做笔记

控制流

for 循环

一般形式:

1
2
3
for x=array
{commands}
end

while循环

1
2
3
while (expression)
{commands}
end

if-else-end结构:

1
2
3
if (expression)
{commands}
end

线性时间选择

线性时间选择

选择一个无序整数列中的第i小

基本思想

利用快速排序的思想 因为快速排序特点是 每一次排序一定能够把一个值给确定位置,因此这里如果我们给确定位置的值和我们要找的值一样 那么我们成功了

RandomSelect

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package com.dwx.passage2;

public class RandomizedSelect {

//正常来说 我们操作的都是整数数组
private int list[];
//我们使用的是private私有对象 因此需要编写get/set方法来设置和获取值

public int[] getList() {
return list;
}

public void setList(int[] list) {
this.list = list;
}

//快速排序的思路是将第一个作为端点 但是我们这里使用一个随机数来获得端点
/*
参数表:
start:列表要查询的开始
end:列表查询的结束
find:我们要查询的第几小
*/

public int RandomizedSelect(int start,int end,int find){
//编写程序结束程序
//如果开始等于结束 我们没有什么课选的了 就选择到了合适的数据
if (start==end){
//这个就是我们找到的第几小的结果
return list[start];
}
int i = RandomQuickSort(start,end);
//比较我们得到的这个第几小和我们的目标小又什么区别
//如果i大 则说明我们要找的find在划分后的后边
//则将我们的起始地址设置为i+1,结束还是end,此时我们要找find-i小
//注意 我们这里的j 因为 我们的start 不一定就是从零开始的 因此 我们选择后的第几小 就需要用find-j
int j = i-start+1;
if (find<=j){
return RandomizedSelect(start,i,find);
}else {
return RandomizedSelect(i+1,end,find-j);
}
}


//这个程序是对我们需要的list的一段进行一次快排 二我们快排的结果是随机的 通过random来获得我们的基准元素
public int RandomQuickSort(int start,int end){
//我们这里只需要一个开始和一个结束
//获得一个随机数 在start和end之间
//我们这里的随机数要设置好
int n = (int)(Math.random()*100)%(end-start)+start;
System.out.println("这里我们将第"+n+"个元素作为基准元素");
//将我们的基准元素存储起来

int t = list[n];
list[n] = list[start];
list[start] = t;
int i,j;
//我们准备进行快排
i = start;
j = end;
//快速排序的思想就是把比基准元素小的都放在左边
//把比基准元素大的都放在右边 然后把基准元素归位
while (i != j){
//先让右哨兵动 找到合适数据后才停止
while (list[j]>=t && j>i){
j--;
}
//说明右哨兵已经选择好了 使左哨兵开始动
while (list[i]<=t && i<j){
i++;
}
//两个哨兵都找到了 交换数据
if (i<j) {
int temp = list[i];
list[i] = list[j];
list[j] = temp;
}

}
//将我们的基准元素放到合适的地方
list[start] = list[i];
list[i] = t;
//我们找到的i就是我们这一次找到的目的元素所在的位置(即第几小)
return i;
}
}

实现类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import com.dwx.passage2.RandomizedSelect;

import java.util.Scanner;

public class RandomSelectTest {
public static void main(String[] args) {
RandomizedSelect select = new RandomizedSelect();
//选择我们的一个list
int[] list = new int[]{13,45,85,63,21,54,96,35,74,84,9,6,3,8,5};

System.out.println("我们的无序数组的长度"+list.length);
select.setList(list);
Scanner scanner = new Scanner(System.in);
System.out.print("请输入我们要选择第几小:");
int find = scanner.nextInt();
int i = select.RandomizedSelect(0, list.length - 1, find);
System.out.println("我们找到的数据"+i);

System.out.println("====================================");
for (int i1 : list) {
System.out.print(i1+"\t");
}
System.out.println();
System.out.println("====================================");
//这里设置一个简单排序来检测结果的正确性
int[] query = query(list);

for (int i1 : query) {
System.out.print(i1+"\t");
}
System.out.println();
System.out.println("理论上我们的目标值"+list[find-1]);

}

//下边我们写一个冒泡排序 把我们的list进行一个排序 看看是否我们的答案和我们的找到的数据相同
public static int[] query(int[] list){
//冒泡排序
int i;
int j;
int temp;
//冒泡排序的思想是 每次找到一个最小的放在应该最小的位置
int min;
for (i=0;i<list.length;i++){
min = i;
for (j=i;j<list.length;j++){
if (list[j] < list[min]){
//记录找到的最小的数的下标
min = j;
}
}
// if (i!=min) {
temp = list[min];
list[min] = list[i];
list[i] = temp;
// }

}
return list;
}
}

这里我们还加装了一个一般排序来检测是否我们实现了

写这个算法真考研逻辑思维能力

棋盘覆盖

棋盘覆盖

棋盘覆盖类似于一个游戏,在啊哈算法中我学到一个管道铺设问题,因此这里我们在介绍一个棋盘覆盖。

我认为这个棋盘覆盖是比管道铺设简单的,因为要铺设的几个方块的大小都是一样的。

算法实现如下

这里我们实现的递归算法

算法程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package com.dwx.passage2;

public class ChessBoard {

//这里我们写一个二维整数数组
private int Board[][];
//全局变量 表示
int title = 0;

public void setBoard(int[][] board) {
Board = board;
}

public int[][] getBoard() {
return Board;
}

//我们使用的还是使用递归算法
public void ChessBoard(int tr, int tc, int dr, int dc, int size){
//这里 tr ,tc表示棋盘左上角的编号(行和列
//dr dcr表示特殊方块所在的地方
//size表示棋盘的大小

//程序结束的条件 已经不能在分了
if (size == 1){
return ;
}
//增加一个骨牌编号
int t = title++;
int s = size/2;
if (dr<tr+s && dc < tc+s){
//说明特殊方块在七班左上角
ChessBoard(tr,tc,dr,dc,s);
}else {
//如果没在 则把左上角棋盘的左上角变成特殊棋盘
Board[tr+s-1][tc+s-1] = t;
ChessBoard(tr,tc,tr+s-1,tc+s-1,s);
}
//同理 操作其他的三个子棋盘
//这个是第
if (dr<tr+s && dc >= tc+s){
ChessBoard(tr,tc+s,dr,dc,s);
}else {
Board[tr+s-1][tc+s] = t;
ChessBoard(tr,tc+s,tr+s-1,tc+s,s);
}
if (dr>=tr+s && dc < tc+s){

ChessBoard(tr+s,tc,dr,dc,s);
}else {
Board[tr+s][tc+s-1] = t;
ChessBoard(tr+s,tc,tr+s,tc+s-1,s);
}
if (dr>=tr+s && dc >= tc+s){

ChessBoard(tr+s,tc+s,dr,dc,s);
}else {
Board[tr+s][tc+s] = t;
ChessBoard(tr+s,tc+s,tr+s,tc+s,s);
}

}
}

测试方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import com.dwx.passage2.ChessBoard;

public class BoardTest {
public static void main(String[] args) {
//现在开一个4*4的二维整数数组
int[][] board = new int[4][4];
//期初都是0
for (int[] ints : board) {
for (int anInt : ints) {
System.out.print(anInt+"\t");
}
System.out.println();
}
//添加一个特殊方块 这里我们选择使用随机函数 我们把特殊方块设为9
//产生o-3的随机数
int x = (int)(Math.random()*10)%4;
int y = (int)(Math.random()*10)%4;
System.out.println("特殊块的所在:"+"("+x+","+y+")");
board[x][y] = 9;
//修改过的棋盘
for (int[] ints : board) {
for (int anInt : ints) {
System.out.print(anInt+"\t");
}
System.out.println();
}
//调用算法 填充棋盘

ChessBoard board1 = new ChessBoard();
//先把我们的目的board设置进去
board1.setBoard(board);
//调用方法处理
board1.ChessBoard(0,0,x,y,4);
//获得调整过的board
int[][] board2 = board1.getBoard();
System.out.println("==========结果=========");
//输出调整过的棋盘
for (int[] ints : board2) {
for (int anInt : ints) {
System.out.print(anInt+"\t");
}
System.out.println();
}

}
}

结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
0	0	0	0	
0 0 0 0
0 0 0 0
0 0 0 0
特殊块的所在:(1,1)
0 0 0 0
0 9 0 0
0 0 0 0
0 0 0 0
==========结果=========
1 1 2 2
1 9 0 2
3 0 0 4
3 3 4 4

迪杰斯特拉算法

迪杰斯特拉算法

今天在学习数学建模的时候发现 matlab实现迪杰斯特拉算法太麻烦了 想来想去还是通过C语言或者JAVA语言来实现这个算法最划算。

算法特点:是来实现查看一个确定的点到其余各个顶点的最短路径问题。

算法思想

每次找到离源点最近的一个顶点,然后以该顶点为中心进行拓展,最终得到源点到其余各顶点的最短路径

重要的概念:松弛,即如果1->3为43,但是1->2->3为13,那么我们就用第二个距离来表示1->3的距离

算法步骤

  • 将所有的顶点分为两个部分,一直最短路程的顶点集合P和未知最短路径的顶点集合Q。使用一个数组Book【】来记录那些点是在集合P中,book[i]=1表示已经在集合中了0表示不在
  • 设置源点s到自己的最短距离为0,即dis[s]=0,如果存在源点能够直接到的点,则设置为e[ s ][ j ]如果不是则设为无穷大(9999)
  • 在集合中找到一个离源点最近的顶点,加入到集合p,并考察以此点到其他的的边并进行松弛操作
  • 循环第三步 知道全部的点都进入到我们的book数组中

算法实现

使用JAVA语言,代码中有注释说明用途

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package com.dwx.passage2;

public class Dijkstar {
public static void main(String[] args) {

int[] dis = new int[10];
int[] book = new int[10];
int i,j,n,u = 0,v,min;
int inf = 99999999;

int e[][] = new int[][]{
{0,2,1,8,inf,inf,inf,inf},
{2,0,inf,6,1,inf,inf,inf},
{1,inf,0,7,inf,inf,9,inf},
{8,6,7,0,5,1,2,inf},
{inf,1,inf,5,0,3,inf,9},
{inf,inf,inf,1,3,0,4,6},
{inf,inf,9,2,inf,4,0,3},
{inf,inf,inf,inf,9,6,3,0}
};
n = e[0].length-1;



//初始化dis数组 这里是记录源点到其他各点的最短距离的
for (i=0;i<=n;i++){
dis[i] = e[0][i];
}

//初始化book数组 book数组是记录已经被放入最短路径集合的点
for (i=0;i<=n;i++){
book[i] = 0;
}
//将第一个点(源点)放入book数组中
book[0] = 1;
//Dijkstra算法的核心
for (i=0;i<=n-1;i++){
min = inf;
//找到距离源点最短的点
for (j=0;j<=n;j++){
if (book[j] == 0 && dis[j]<min){
min = dis[j];
u = j;
}
}
//将这个点读到book数组中
book[u] = 1;
for (v=0;v<=n;v++){
//收缩调整最短路径
if (e[u][v] < inf){
if (dis[v]>dis[u]+e[u][v]){
dis[v] = dis[u]+e[u][v];
}
}
}

}
for (int di : dis) {
System.out.print(di+"\t");
}



}


}


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package com.dwx.passage2;

import java.util.Scanner;

public class Dijkstra {
public static void main(String[] args) {
int[][] e = new int[10][10];
int[] dis = new int[10];
int[] book = new int[10];
int i,j,n,m,t1,t2,t3,u = 0,v,min;
int inf = 99999999;


//这个操作是在实现存储图
//读入顶点个数 和 边的条数
Scanner scanner = new Scanner(System.in);
//n表示顶点个数 m表示边数
n = scanner.nextInt();
m = scanner.nextInt();

//初始化 将自己到自己的顶点为0 其他的全改为inf
for(i = 1;i <= n;i++){
for (j = 1;j<=n;j++){
if (i == j){
e[i][j] = 0;
}else {
e[i][j] = inf;
}

}
}


//读入边和权值
//这里我们使用的是有向边
for (i = 1; i <= m;i++){
//这里 t1表示起始的顶点 t2表示目标定点 t3表示权值
t1 = scanner.nextInt();
t2 = scanner.nextInt();
t3 = scanner.nextInt();
e[t1][t2] = t3;
// e[t2][t1] = t3; //如果加上这一句话 就是在储存无向图
}
//初始化dis数组 这里是记录源点到其他各点的最短距离的
for (i=1;i<=n;i++){
dis[i] = e[1][i];
}

//初始化book数组 book数组是记录已经被放入最短路径集合的点
for (i=1;i<=n;i++){
book[i] = 0;
}
//将第一个点(源点)放入book数组中
book[1] = 1;
//Dijkstra算法的核心
for (i=1;i<=n-1;i++){
min = inf;
//找到距离源点最短的点
for (j=1;j<=n;j++){
if (book[j] == 0 && dis[j]<min){
min = dis[j];
u = j;
}
}
//将这个点读到book数组中
book[u] = 1;
for (v=1;v<=n;v++){
//收缩调整最短路径
if (e[u][v] < inf){
if (dis[v]>dis[u]+e[u][v]){
dis[v] = dis[u]+e[u][v];
}
}
}

}
for (int di : dis) {
System.out.print(di+"\t");
}



}
}

**输入**
6 9
1 2 1
1 3 12
2 3 9
2 4 3
3 5 5
4 3 4
4 5 13
4 6 16
5 6 4

SpringMVC解决JSON乱码

SpringMVC解决JSON乱码

在前后端的交互中可能会因为两者的编码类型不同而差生不同的乱码,正常情况下的乱码

一般情况下的乱码

普通情况下的中文乱码是生僻字加符号的形式

这是解决乱码的方式是在Tomact上加上-Dfile.encoding=UTF-8在VM option中加

在web.xml中加上过滤器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<filter>
<filter-name>encoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

JSON乱码

由于现在是前后盾分离时代,前后端的数据交互是通过JSON这种超文本形式进行的,因此JSON也可能出现中文乱码问题

JSON乱码的特点:JSON乱码很有特点 是几个????组成的

JSON乱码在springMVC框架下的更改 只需要把RequestMapping修改成以下格式就行

@RequestMapping(value = "enroll",produces = "application/json;charset=utf-8")

编写软件的过程

编写软件的过程

2022/2/23

和胡振宇讨论了一下这个软件的大体内容,已经编写这个软件需求分析

大致的步奏

  • 上传数据
  • 数据分析
  • 生成文档

要求

  • 数据库设置限制,有管理员能够修改数据
  • 用户只需要填写表格 以及获得生成的最终表格 过程中的表格要管理员看

问题

  • 是填写数据还是上传有格式的文档(填写一到表5)
  • 生成表格是直接生成还是有一段时间后生成(自动封锁24h)
  • 表格生成给谁?
  • 这些表格之间的关系

时间要求

今年年底

2022/2/24

了解了一下Excel的读方法

Excel的读取方法不同于正常的文件的读写,需要导入阿帕奇的poi的包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<dependencies>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>4.1.2</version>
</dependency>
</dependencies>

这边我做了一个简单的读取Excel文件的方法(这里是以.xlsx为尾缀的)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package com.dwx.file;


import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.File;
import java.io.FileInputStream;

public class ReadExlse {
public static void main(String[] args) throws Exception {

//正常的文件类File无法读取Excel文件,需要使用Apache的包
//Excel的全路径
String path = "E:\\java\\filetest\\src\\main\\java\\com\\dwx\\file\\test.xlsx";
File file = new File(path);
System.out.println(file.isFile());
//对文件进行操作 将文件转化成流
FileInputStream stream = new FileInputStream(file);
//对这个文件流进行操作
//创建这个Excel的对象
XSSFWorkbook sheets = new XSSFWorkbook(stream);

//获取全部的sheets数
int numberOfSheets = sheets.getNumberOfSheets();
System.out.println("================================================");
System.out.println("此文件的所有表格数为:"+numberOfSheets);
System.out.println("================================================");
for (int k=0;k<numberOfSheets;k++) {
System.out.println("这是第"+(k+1)+"个表格");
XSSFSheet sheetAt = sheets.getSheetAt(k);

int firstRowNum = sheetAt.getFirstRowNum();
int lastRowNum = sheetAt.getLastRowNum();
System.out.println(firstRowNum);
System.out.println(lastRowNum);

for (int i = firstRowNum; i <= lastRowNum; i++) {
XSSFRow row = sheetAt.getRow(i);
if (row==null){
System.out.println(" ");
continue;
}

short lastCellNum = row.getLastCellNum();
short firstCellNum = row.getFirstCellNum();
if (lastCellNum < 0 || firstCellNum < 0){
continue;
}

for (int j = firstCellNum; j <= lastCellNum; j++) {
XSSFCell cell = row.getCell(j);
System.out.print(cell + "\t");
}
System.out.println();
}
}
//关闭流
sheets.close();
stream.close();

}
}

了解了一下Excel的写的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package com.dwx.file;

import org.apache.poi.xssf.usermodel.*;


import java.io.FileOutputStream;
import java.io.IOException;

public class WriteExlse {
//这个程序是一个写Excel的程序 面向的尾缀也是xlsx
public static void main(String[] args) throws IOException {
String fileName = "C:\\Users\\Lenovo\\Desktop\\监审软件编译"+"\\MyExlse"+".xlsx";
String sheetName = "sheet01";

//设置一个sheets
XSSFWorkbook sheets = new XSSFWorkbook();
//设置第一个表的表格
//设置第一个表的row数目
int firstRowNumber = 0;
int lastRowNumber = 10;
int firstCellNumber = 0;
int lastCellNumber = 5;
//一个整个Excel文件创建一个表
XSSFSheet sheet = sheets.createSheet(sheetName);
XSSFRow xssfRow;
XSSFCell xssfCell;

for (int i=firstRowNumber;i<lastRowNumber;i++){

//表给某一行设置一个行
XSSFRow row = sheet.createRow(i);

for (int j=firstCellNumber;j<lastCellNumber;j++){
//对这个行设置更多的cell(小室)
XSSFCell cell = row.createCell(j);
//给这个cell(小室)设置值
cell.setCellValue("test");
}


}
//编写一个输出流
FileOutputStream stream = new FileOutputStream(fileName);
//把流写出去 一个sheets Excel表写出去
sheets.write(stream);


}
}

2022/2/26

分析了数据库怎么建:选择创建链表的形式创建数据库

对用户的需求进行分析

2022/2/27

分析了应该去创建一个网站 我自己负责表格的编写工作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
package com.dwx.file;

import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class minban_fengmian {
public XSSFSheet setminban_fengmain(XSSFWorkbook sheets){


//设置民办封面
//创建一个sheet
XSSFSheet sheet = sheets.createSheet("封面");
//封面的第一行是空着的
int i;
XSSFRow xssfRow;
XSSFCell xssfCell;
// 申请第一行 行和列都是从零开始的
XSSFRow row = sheet.createRow(0);
CellRangeAddress cellAddresses1 = new CellRangeAddress(0, 0, 0, 1);
sheet.addMergedRegion(cellAddresses1);
//第一行是四个cell
for ( i = 0;i<4;i++){
XSSFCell cell = row.createCell(i);
//第一行都是空着的 因此我们也把这个值设成空值
cell.setCellValue("");
}

//下边编写第二行
//第二行只用一列
//设置单元格的合并
CellRangeAddress cellAddresses = new CellRangeAddress(1, 1, 0, 5);
sheet.addMergedRegion(cellAddresses);
XSSFRow row1 = sheet.createRow(1);
XSSFCell cell = row1.createCell(0);
cell.setCellValue("新乡市民办学校教育定价成本监审表");

//第三行是一个空格行
CellRangeAddress cellAddresses2 = new CellRangeAddress(2, 2, 0, 5);
sheet.addMergedRegion(cellAddresses2);
XSSFRow row2 = sheet.createRow(2);
XSSFCell cell1 = row2.createCell(0);
cell1.setCellValue("");
//为第五后的合并单元格
for (i=3;i<=11;i++){
CellRangeAddress cellAddresses4 = new CellRangeAddress(i, i, 2, 4);
sheet.addMergedRegion(cellAddresses4);
}
//第五航到第12行
String[] name = new String[]{"学 校 名 称","法 定人 代 表","学 校 地 址","邮 政 编 码","财务负责人","填 表 人","电 话 ","邮 箱","传 真 "};
for (i = 3;i<=11; i++){
XSSFRow row4 = sheet.createRow(i);
XSSFCell cell4 = row4.createCell(1);
cell4.setCellValue(name[i-3]);

}
//第十三行是空格行
sheet.createRow(12);
//第十四行
XSSFRow row3 = sheet.createRow(13);
XSSFCell cell2 = row3.createCell(3);
cell2.setCellValue("学校盖章");
CellRangeAddress cellAddresses3 = new CellRangeAddress(13, 13, 3, 4);
sheet.addMergedRegion(cellAddresses3);
//第十五行

XSSFRow row4 = sheet.createRow(14);
XSSFCell cell3 = row4.createCell(3);
cell3.setCellValue(" 年");

XSSFCell cell4 = row4.createCell(4);
cell4.setCellValue(" 月 日");

//一下是对表格的宽度等的优化

//设置列宽

sheet.setColumnWidth(0, 258*23+184);
sheet.setColumnWidth(1, 258*23+184);
sheet.setColumnWidth(3, 258*13+184);
sheet.setColumnWidth(4, 258*13+184);
sheet.setColumnWidth(5, 258*28+184);

//设置行高
sheet.setDefaultRowHeight((short) 456);




return sheet;
}
}

生成的第一个目标Excel,编写的格式和列宽和行高需要以后在改

2022/2/28

编写民办的第三张表 编写表的过程越来越快 现在平均2h能编好一张表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
package com.dwx.file;

import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class minban_biaoyi {
public XSSFSheet setSheet(XSSFWorkbook sheets){

String sheetName = "基本情况表1";
XSSFSheet sheet = sheets.createSheet(sheetName);


//编写第一行的内容
XSSFRow row = sheet.createRow(0);
XSSFCell cell = row.createCell(0);
cell.setCellValue("表:一");

//编写第二行的内容
//第二行是从A到L有一个合并单元格
CellRangeAddress cellAddresses = new CellRangeAddress(1, 1, 0, 11);
sheet.addMergedRegion(cellAddresses);
XSSFRow row1 = sheet.createRow(1);
XSSFCell cell1 = row1.createCell(0);

cell1.setCellValue("XXX学校教育定价成本监审学生人数调查表");
//第三行也是一个大的合并单元格
CellRangeAddress cellAddresses2 = new CellRangeAddress(2, 2, 0, 11);
sheet.addMergedRegion(cellAddresses2);
XSSFRow row2 = sheet.createRow(2);
XSSFCell cell2 = row2.createCell(0);

cell2.setCellValue("学校名称:(盖章)");
//第四五行有一个不规律的合并单元格
CellRangeAddress cellAddresses1 = new CellRangeAddress(3, 4, 0, 0);
CellRangeAddress cellAddresses6 = new CellRangeAddress(3, 4, 1, 1);
CellRangeAddress cellAddresses3 = new CellRangeAddress(3, 4, 8, 8);
CellRangeAddress cellAddresses4 = new CellRangeAddress(3, 4, 9, 9);
CellRangeAddress cellAddresses5 = new CellRangeAddress(3, 4, 10, 10);
CellRangeAddress cellAddresses7 = new CellRangeAddress(3, 4, 11, 11);
sheet.addMergedRegion(cellAddresses1);
sheet.addMergedRegion(cellAddresses6);
sheet.addMergedRegion(cellAddresses3);
sheet.addMergedRegion(cellAddresses4);
sheet.addMergedRegion(cellAddresses5);
sheet.addMergedRegion(cellAddresses7);
//又有一系列小的横向合并
for (int i=2;i<8;i=i+2){
CellRangeAddress cellAddresses8 = new CellRangeAddress(3, 3, i, i + 1);
sheet.addMergedRegion(cellAddresses8);
}
//给第4、5行填值

XSSFRow row3 = sheet.createRow(3);
row3.createCell(0).setCellValue("项 目");
row3.createCell(1).setCellValue("栏次及关系");
row3.createCell(8).setCellValue("总监审数");
row3.createCell(9).setCellValue("教育生均监审数");
row3.createCell(10).setCellValue("住宿生均监审数");
row3.createCell(11).setCellValue("备注");
row3.createCell(2).setCellValue("2019年");
row3.createCell(4).setCellValue("2020年");
row3.createCell(6).setCellValue("2021年");

XSSFRow row4 = sheet.createRow(4);
for (int j = 2;j<=7;j++){
if (j%2 == 0){
row4.createCell(j).setCellValue("申报数");
}else {
row4.createCell(j).setCellValue("核定数");
}
}

//对于表二 固定的值为两个列
//使用数组的思路进行存值
String[] list1 = new String[]{
"一、规模班数" ,
"小学" ,
"初中" ,
"高中" ,
"二、班人数" ,
"小学(人/班" ,
"初中(人/班" ,
"高中(人/班" ,
"三、规模人数" ,
"小学" ,
"初中" ,
"高中" ,
"四、实际班级数(个)" ,
"小学" ,
"初中" ,
"高中" ,
"五、实际在校平均标准学生数" ,
"(一)小学标准学生数" ,
"其中:年初学生数" ,
" 年末学生数" ,
"(二)初中标准学生数" ,
"其中:年初学生数" ,
" 年末学生数" ,
"(三)高中标准学生数" ,
"其中:年初学生数" ,
" 年末学生数" ,
"六、实际在校平均住宿标准学生数" ,
"(一)小学标准住宿学生数" ,
"其中:年初学生数" ,
" 年末学生数" ,
"(二)初中标准住宿学生数" ,
"其中:年初学生数" ,
" 年末学生数" ,
"(三)高中标准住宿学生数" ,
"其中:年初学生数" ,
" 年末学生数"
};
int listLength,b;
//
listLength = list1.length;
for (b=0;b<listLength;b++){
XSSFRow row5 = sheet.createRow(b+5);
row5.createCell(0).setCellValue(list1[b]);
row5.createCell(1).setCellValue(b+1);

}

//填充L列备注的填充
//L列有几个单元格的合并
sheet.addMergedRegion(new CellRangeAddress(6,8,11,11));
sheet.addMergedRegion(new CellRangeAddress(10,12,11,11));
sheet.addMergedRegion(new CellRangeAddress(14,16,11,11));
sheet.addMergedRegion(new CellRangeAddress(18,20,11,11));
sheet.addMergedRegion(new CellRangeAddress(22,30,11,11));
sheet.addMergedRegion(new CellRangeAddress(32,40,11,11));

//给备注填值

int [] rowNumber = new int[]{5,6,9,10,14,18,22,32};

String[] rowValue = new String[]{
"建校时可容纳班级数" ,
"2019-2020年填写“双减”前规模数;2021年按“双减”后规模数填写。" ,
"建校时每班人数" ,
"2019-2020年填写“双减”前规模数;2021年按“双减”后规模数填写。" ,
"规模人数=规模班数X班级人数" ,
"纸质说明每个年级多少个班?" ,
"按实际在校学生人数填写,或按三年学籍人数纸质上报。",
"按实际在校住宿学生人数填写。"
};
for (int o=0;o<=7;o++){
sheet.getRow(rowNumber[o]).createCell(11).setCellValue(rowValue[o]);
}

//内容填充部分已经全部填写完毕 开始设置表格的列宽
sheet.setColumnWidth(0,258*36+184);
sheet.setColumnWidth(1,258*22+184);
sheet.setColumnWidth(11,258*66+184);



return sheet;
}
}

我思考了一下问题,我可以通过添加一个set方法,来实现给每一张表中的数据进行填值

2022/3/1

编写了民办表基本情况表二

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
package com.dwx.file;

import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class minban_biaoer {

public XSSFSheet setSheet(XSSFWorkbook sheets){

//创建子表格 并且给其附上名字
String sheetName = "基本情况表2";
XSSFSheet sheet = sheets.createSheet(sheetName);


//编写第一行的内容
XSSFRow row = sheet.createRow(0);
XSSFCell cell = row.createCell(0);
cell.setCellValue("表:二");

//编写第二行的内容
//第二行是从A到L有一个合并单元格
CellRangeAddress cellAddresses = new CellRangeAddress(1, 1, 0, 11);
sheet.addMergedRegion(cellAddresses);
XSSFRow row1 = sheet.createRow(1);
XSSFCell cell1 = row1.createCell(0);

cell1.setCellValue("新乡市民办学校教育定价成本监审其它情况调查表");
//第三行也是一个大的合并单元格
CellRangeAddress cellAddresses2 = new CellRangeAddress(2, 2, 0, 11);
sheet.addMergedRegion(cellAddresses2);
XSSFRow row2 = sheet.createRow(2);
XSSFCell cell2 = row2.createCell(0);

cell2.setCellValue("学校名称:(盖章) 单位:人");

//第四五行有一个不规律的合并单元格
CellRangeAddress cellAddresses1 = new CellRangeAddress(3, 4, 0, 0);
CellRangeAddress cellAddresses6 = new CellRangeAddress(3, 4, 1, 1);
CellRangeAddress cellAddresses3 = new CellRangeAddress(3, 4, 8, 8);
CellRangeAddress cellAddresses4 = new CellRangeAddress(3, 4, 9, 9);
CellRangeAddress cellAddresses5 = new CellRangeAddress(3, 4, 10, 10);
CellRangeAddress cellAddresses7 = new CellRangeAddress(3, 4, 11, 11);
sheet.addMergedRegion(cellAddresses1);
sheet.addMergedRegion(cellAddresses6);
sheet.addMergedRegion(cellAddresses3);
sheet.addMergedRegion(cellAddresses4);
sheet.addMergedRegion(cellAddresses5);
sheet.addMergedRegion(cellAddresses7);
//又有一系列小的横向合并
for (int i=2;i<8;i=i+2){
CellRangeAddress cellAddresses8 = new CellRangeAddress(3, 3, i, i + 1);
sheet.addMergedRegion(cellAddresses8);
}
//给第4、5行填值

XSSFRow row3 = sheet.createRow(3);
row3.createCell(0).setCellValue("项 目");
row3.createCell(1).setCellValue("栏次及关系");
row3.createCell(8).setCellValue("总监审数");
row3.createCell(9).setCellValue("教育生均监审数");
row3.createCell(10).setCellValue("住宿生均监审数");
row3.createCell(11).setCellValue("备注");
row3.createCell(2).setCellValue("2019年");
row3.createCell(4).setCellValue("2020年");
row3.createCell(6).setCellValue("2021年");

XSSFRow row4 = sheet.createRow(4);
for (int j = 2;j<=7;j++){
if (j%2 == 0){
row4.createCell(j).setCellValue("申报数");
}else {
row4.createCell(j).setCellValue("核定数");
}
}

String[] listC1 = new String[]{
"一、教职工总数" ,
"(一)行政管理人数 " ,
"(二)小学教师人员数" ,
"(三)初中教师人员数" ,
"(四)高中教师人员数" ,
"(五)宿管人员数" ,
"(六)餐厅人员数" ,
"(七)其他辅助人员数" ,
"(八)临时人员 " ,
"二、总建筑面积" ,
"(一)教学建筑面积" ,
"小学" ,
"初中" ,
"高中" ,
"共用建筑面积" ,
"(二)住宿面积" ,
"小学" ,
"初中" ,
"高中" ,
"(三)餐厅面积" ,
"三、年收入" ,
"学费收入" ,
"餐厅收入" ,
"其它收入",
"四、现执行收费标准"
};
String[] listC10 = new String[]{
"" ,
"指校长、学生科、教导处、会计室、维修人员等",
"" ,
"" ,
"" ,
"" ,
"" ,
"保洁、保安和其它人员" ,
"低质说明从事什么岗位,工资如何发放。" ,
"" ,
"" ,
"" ,
"" ,
"" ,
"指大门、厕所等共用设施" ,
"" ,
"" ,
"" ,
"" ,
"" ,
"" ,
"" ,
"" ,
"" ,
"单位:元/生.年"
};
int listC1Length = listC1.length;
int i;
for (i=0;i<listC1Length;i++){
XSSFRow row5 = sheet.createRow(i + 5);
row5.createCell(0).setCellValue(listC1[i]);
row5.createCell(1).setCellValue(i+1);
row5.createCell(11).setCellValue(listC10[i]);
}

//内容填充部分已经全部填写完毕 开始设置表格的列宽
sheet.setColumnWidth(0,258*36+184);
sheet.setColumnWidth(1,258*22+184);
sheet.setColumnWidth(11,258*66+184);


return sheet;
}
}

表三编写成功

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
package com.dwx.file;

import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class minban_biaosan {

public XSSFSheet setSheet(XSSFWorkbook sheets){

//创建的子表格的名字
String sheetName = "三年审计报告表3";
XSSFSheet sheet = sheets.createSheet(sheetName);

//编写第一行的内容
XSSFRow row = sheet.createRow(0);
XSSFCell cell = row.createCell(0);
cell.setCellValue("表三");
//编写第二行的内容
//第二行是从A到L有一个合并单元格
CellRangeAddress cellAddresses = new CellRangeAddress(1, 1, 0, 10);
sheet.addMergedRegion(cellAddresses);
XSSFRow row1 = sheet.createRow(1);
XSSFCell cell1 = row1.createCell(0);

cell1.setCellValue("新乡市xxx学校审计数基本情况表");

//第四五行有一个不规律的合并单元格
CellRangeAddress cellAddresses1 = new CellRangeAddress(2, 3, 0, 0);
CellRangeAddress cellAddresses2 = new CellRangeAddress(2, 3, 10, 10);
sheet.addMergedRegion(cellAddresses1);
sheet.addMergedRegion(cellAddresses2);

//又有一系列小的横向合并
for (int i=1;i<=9;i=i+3){
CellRangeAddress cellAddresses8 = new CellRangeAddress(2, 2, i, i + 2);
sheet.addMergedRegion(cellAddresses8);
}
//给第4、5行填值

XSSFRow row3 = sheet.createRow(2);
row3.createCell(0).setCellValue("");
row3.createCell(1).setCellValue(2019);
row3.createCell(4).setCellValue(2020);
row3.createCell(7).setCellValue(2021);



XSSFRow row2 = sheet.createRow(3);
for (int j = 1;j<=9;j++){
if (j%3 == 0){
row2.createCell(j).setCellValue("申报数");
}else if (j%3 == 2){
row2.createCell(j).setCellValue("核增核减数");
}else {
row2.createCell(j).setCellValue("审计数");
}
}
row3.createCell(10).setCellValue("备注");


//第一列的所有数据
String[] listC1 = new String[]{
"一、人员支出" ,
"1、行政和其它人员" ,
"2、教师" ,
"3、宿管人员" ,
"4、社会保障费" ,
"5、福利费" ,
"(一)小学人员支出",
"1、行政和其它人员" ,
"2、教师",
"3、宿管人员" ,
"4、社会保障费" ,
"5、福利费" ,
"(二)初中人员支出" ,
"1、行政和其它人员" ,
"2、教师" ,
"3、宿管人员" ,
"4、社会保障费" ,
"5、福利费" ,
"(三)高中人员支出" ,
"1、行政和其它人员" ,
"2、教师" ,
"3、宿管人员" ,
"4、社会保障费" ,
"5、福利费" ,
"二、租赁费" ,
"(一)小学租赁费" ,
"小学教学" ,
"小学住宿" ,
"(二)初中租赁费" ,
"初中教学" ,
"初中住宿" ,
"(三)高中租赁费" ,
"高中教学" ,
"高中住宿" ,
"三、财务费用" ,
"(一)小学财务费用" ,
"小学教学" ,
"小学住宿" ,
"(二)初中财务费用" ,
"初中教学" ,
"初中住宿" ,
"(三)高中财务费用" , "高中教学\n" ,
"高中住宿" ,
"四、公用支出" ,
"1、办公费" ,
"2、水电费" ,
"3、维修费" ,
"4、职工教育经费" ,
"5、工会经费" ,
"6、招待费" ,
"7、交通费" ,
"8、" ,
"9、" ,
"10、" ,
"11、" ,
"12、" ,
"13、" ,
"14、" ,
"15、其它费用" ,
"五、合计" ,
"六、固定资产原值"
};
int listNumber = listC1.length;
int i ;
for (i=0;i<listNumber;i++){
XSSFRow row5 = sheet.createRow(i + 4);
row5.createCell(0).setCellValue(listC1[i]);
}

//设置第K列的数据 K列有很多的合并单元格先合并单元格
int[] list1 = new int[]{10,29,39,48};
int[] list2 = new int[]{17,8,8,15};
for (int j = 0;j<4;j++){
CellRangeAddress cellAddresses3 = new CellRangeAddress(list1[j],list1[j]+list2[j], 10, 10);
sheet.addMergedRegion(cellAddresses3);
}
//为底k列设值
int[] list3 = new int[]{10,28,29,38,39,48,64,65};
//设置值
String[] listK = new String[]{
"提供2021全体人员工资发放表" ,
"提供三年租赁合同" ,
"按建筑面积比或学生比分摊" ,
"提供金融机构贷款合同" ,
"按建筑面积比或学生比分摊" ,
"根据审计报告科目,可增加科目或另行加行。" ,
"和审计报告数是否一致?" ,
"和审计报告数一致"
};
for (i = 0;i<=7;i++){
sheet.getRow(list3[i]).createCell(10).setCellValue(listK[i]);

}
//设置表格宽
sheet.setColumnWidth(0,256*32+184);
sheet.setColumnWidth(10,256*30+184);



return sheet;
}
}

表四编写成功

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package com.dwx.file;

import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class minban_biaosi {
public XSSFSheet setSheet(XSSFWorkbook sheets){
String sheetName = "固定资产表4";
XSSFSheet sheet = sheets.createSheet(sheetName);
//编写第一行
//编写第一行的内容
XSSFRow row = sheet.createRow(0);
XSSFCell cell = row.createCell(0);
cell.setCellValue("表四");
//编写第二行的内容
//第二行是从A到L有一个合并单元格
CellRangeAddress cellAddresses = new CellRangeAddress(1, 1, 0, 10);
sheet.addMergedRegion(cellAddresses);
XSSFRow row1 = sheet.createRow(1);
XSSFCell cell1 = row1.createCell(0);

cell1.setCellValue("XXX学校2021年度固定资产折旧核定表");
//第三行是从A到L有一个合并单元格
CellRangeAddress cellAddresses1 = new CellRangeAddress(2, 2, 0, 10);
sheet.addMergedRegion(cellAddresses1);
XSSFRow row2 = sheet.createRow(2);
XSSFCell cell2 = row2.createCell(0);

cell2.setCellValue("单位名称:(盖章) 残值率:3% 单位:元");

//编写第四行的内容
String[] list4 = new String[]{"项 目","栏次及关系","原值","教学原值","公用支出核转","宿舍原值","餐厅原值","折旧年限","教学年折旧","宿舍年折旧","备注"};
//给第四行填值
XSSFRow row3 = sheet.createRow(3);
for (int i = 0 ; i < 11;i++) {
row3.createCell(i).setCellValue(list4[i]);
}

//第一列是一个有规律的列 给其添值
String[] list5 = new String[]{"一、房屋建筑物",
"1、钢结构混凝土结构" ,
"2、砖混结构" ,
"3、房屋附属物和构筑物" ,
"二、通用设备" ,
"三、专用设备" ,
"四、家具" ,
"五、土地" ,
"六、合计" ,
"七、预增固定资产",
"八、合计"};
for (int j = 0;j <=10;j++){
sheet.createRow(j+4).createCell(0).setCellValue(list5[j]);
sheet.getRow(j+4).createCell(1).setCellValue(j+1);
}
sheet.getRow(11).createCell(10).setCellValue("购地合同");
sheet.getRow(12).createCell(10).setCellValue("C13和审计报告数是否一致?");

//创建倒数第二行 一个大的合并
CellRangeAddress cellAddresses2 = new CellRangeAddress(15, 15, 0, 10);
CellRangeAddress cellAddresses3 = new CellRangeAddress(16, 16, 2, 6);
sheet.addMergedRegion(cellAddresses2);
sheet.addMergedRegion(cellAddresses3);
//设值
sheet.createRow(15).createCell(0).setCellValue("1、通用设备包括计算机、网络设备、安全设备、终端设备、存储设备、电话机、传真机、复印机、投影仪、多功能一体机、车辆、音像设备、电子白板、LED显示屏、触控一体机、图书等;2、专用设备包括电梯、制冷空调、锅炉、空气能、后续安装的电机、变压器、电源设备、直饮供水设备、乐器、舞台设备、多功能厅设备、田径设备、球类设备、体育运动辅助设备等。");
sheet.createRow(16).createCell(2).setCellValue("填表说明:加黄线的不要填写,更不要更改公式");

//设置表格宽度
sheet.setColumnWidth(0,256*32+184);
sheet.setColumnWidth(10,256*35+184);



return sheet;
}
}

表五编写成功

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
package com.dwx.file;

import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class minban_biaowu {
public XSSFSheet setSheet(XSSFWorkbook sheets){
String sheetName = "三年账册相关科目表5";
XSSFSheet sheet = sheets.createSheet(sheetName);
//编写第一行
//编写第一行的内容
XSSFRow row = sheet.createRow(0);
XSSFCell cell = row.createCell(0);
cell.setCellValue("表五");
//第二行是从A到L有一个合并单元格
CellRangeAddress cellAddresses = new CellRangeAddress(1, 1, 0, 10);
sheet.addMergedRegion(cellAddresses);
XSSFRow row1 = sheet.createRow(1);
XSSFCell cell1 = row1.createCell(0);

cell1.setCellValue("新乡市xxx学校账册基本情况调查表");
//第三行是从A到L有一个合并单元格

//第思维航的第一个合并列
sheet.addMergedRegion(new CellRangeAddress(2,3,0,0));
//又有一系列小的横向合并
for (int i=0;i<=6;i=i+3){
CellRangeAddress cellAddresses1 = new CellRangeAddress(2, 2, i+1, i+3);
sheet.addMergedRegion(cellAddresses1);
}
//添值
sheet.createRow(2).createCell(0).setCellValue("科目");
sheet.getRow(2).createCell(1).setCellValue("2019年");
sheet.getRow(2).createCell(4).setCellValue("2020年");
sheet.getRow(2).createCell(7).setCellValue("2021年");
XSSFRow row4 = sheet.createRow(3);
for (int j = 1;j<=9;j++){
if (j%3 == 0){
row4.createCell(j).setCellValue("凭证类型");
}else if (j%3 == 2){
row4.createCell(j).setCellValue("账册号");
}else {
row4.createCell(j).setCellValue("金额");
}
}

row4.createCell(10).setCellValue("备注");

//对第一列进行添值
String[] listC1 = new String[]{
"一、维修费" ,
"1、" ,
"2、" ,
"3、" ,
"4、" ,
"5、" ,
"二、低值易耗品" ,
"1、" ,
"2、" ,
"3、" ,
"4、" ,
"5、" ,
"三、其它支出" ,
"1、" ,
"2、" ,
"3、" ,
"4、" ,
"5、" ,
"四、财务费用" ,
"1、" ,
"2、" ,
"3、" ,
"4、" ,
"5、"
};
int i = 0;
for (i = 0;i<=23;i++){
sheet.createRow(i+4).createCell(0).setCellValue(listC1[i]);
}
//备注行有很多的合并单元格 这些单元格的合并都是五行
int[] list1 = new int[]{4,10,16,22};
String[] list2 = new String[]{
"1、统计大于该科目金额20%的明细。2、凭证类型填写发票、合同(协议)、白条(收据)" ,

"1、统计大于该科目金额20%的明细。2、凭证类型填写发票、合同(协议)、白条(收据)" ,

"1、如果金额大于公用支出20%,请按内容分类。 如果金额小于公用支出20%,不填写。2、凭证类型填写发票、合同(协议)、白条(收据)" ,

"1、统计还款利息。2、凭证类型填写发票、合同(协议)、白条(收据)."


};
for (i = 0;i<=3;i++){
sheet.addMergedRegion(new CellRangeAddress(list1[i],list1[i]+5,10,10));
sheet.getRow(list1[i]).createCell(10).setCellValue(list2[i]);
}

//设置列表的行宽

sheet.setColumnWidth(0,256*17+184);
sheet.setColumnWidth(10,256*66+184);



return sheet;
}
}

2022/3/2

民办表编写结束

教育参数表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package com.dwx.file;

import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class minban_jiaoyuhesuanbiao {

public XSSFSheet setSheet(XSSFWorkbook sheets){
String sheetName = "教育核定表";
int i,j;

XSSFSheet sheet = sheets.createSheet(sheetName);

//对第一行进行合并单元格
sheet.addMergedRegion(new CellRangeAddress(0,0,0,4));
sheet.addMergedRegion(new CellRangeAddress(1,1,0,4));
//给第一、二行添值
sheet.createRow(0).createCell(0).setCellValue("表一");
sheet.createRow(1).createCell(0).setCellValue("XXX学校2021年度教育培养、住宿成本生均核定表");
//给第一列添值
String[] list1 = new String[]{
"项目" ,
"一、基本情况" ,
"(一)标准学生数" ,
"1、小学" ,
"2、初中" ,
"3、高中" ,
"(二)教职工" ,
"1、小学" ,
"2、初中" ,
"3、高中" ,
"(三)占地面积" ,
"(四)建筑面积" ,
"二、成本构成" ,
"(一)人员支出" ,
"1、小学" ,
"2、初中" ,
"3、高中" ,
"(二)租赁费" ,
"1、小学" ,
"2、初中" ,
"3、高中" ,
"(三)财务费用" ,
"1、小学" ,
"2、初中" ,
"3、高中" ,
"(四)商品和服务支出" ,
"(五)固定资产折旧" ,
"三、生均成本"
};
int listLength = list1.length;
for (i = 0;i<listLength;i++){
sheet.createRow(i+2).createCell(0).setCellValue(list1[i]);
}
sheet.getRow(2).createCell(1).setCellValue("申报数");
sheet.getRow(2).createCell(2).setCellValue("核定数");
sheet.getRow(2).createCell(3).setCellValue("教育成本核定数");
sheet.getRow(2).createCell(4).setCellValue("住宿成本核定数");

//调整列表的宽
sheet.setColumnWidth(0,256*33+184);


return sheet;
}
}

成分分析表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
package com.dwx.file;

import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class minban_chengfenfenxibiao {

public XSSFSheet setSheet(XSSFWorkbook sheets){

String sheetName = "成本分析表";
XSSFSheet sheet = sheets.createSheet(sheetName);
int i,j;

sheet.addMergedRegion(new CellRangeAddress(1,1,0,6));
sheet.createRow(1).createCell(0).setCellValue("新乡市xxx学校成本分析表");
//老朋友 一系列合并单元格
sheet.addMergedRegion(new CellRangeAddress(2,3,0,0));
sheet.addMergedRegion(new CellRangeAddress(2,3,1,1));
sheet.addMergedRegion(new CellRangeAddress(2,3,2,2));
sheet.addMergedRegion(new CellRangeAddress(2,3,3,3));

//给合并过的单元格设值
XSSFRow row = sheet.createRow(2);
row.createCell(0).setCellValue("");
row.createCell(1).setCellValue("成本核算结果");
row.createCell(2).setCellValue("项目占比");
row.createCell(3).setCellValue("公充值");
row.createCell(4).setCellValue("是否合理");
row.createCell(6).setCellValue("备注");
XSSFRow row1 = sheet.createRow(3);
row1.createCell(4).setCellValue("下限");
row1.createCell(5).setCellValue("上限");


sheet.addMergedRegion(new CellRangeAddress(2,2,4,5));

String[] list = new String[]{
"一、人员支出" ,
"1、小学" ,
"2、初中" ,
"3、高中" ,
"二、租赁费" ,
"1、小学" ,
"2、初中" ,
"3、高中" ,
"三、财务费用" ,
"1、小学" ,
"2、初中" ,
"3、高中" ,
"四、商品和服务支出" ,
"1、小学" ,
"2、初中" ,
"3、高中" ,
"五、固定资产折旧" ,
"1、小学" ,
"2、初中" ,
"3、高中" ,
"六、成本合计" ,
"1、小学" ,
"2、初中" ,
"3、高中"
};
int listLength = list.length;
for (i=0;i<listLength;i++){
sheet.createRow(i+4).createCell(0).setCellValue(list[i]);
}
sheet.getRow(5).createCell(3).setCellValue("0.65-0.75");
sheet.getRow(6).createCell(3).setCellValue("0.65-0.75");
sheet.getRow(7).createCell(3).setCellValue("0.65-0.75");


sheet.getRow(9).createCell(3).setCellValue("0.08-0.12");
sheet.getRow(10).createCell(3).setCellValue("0.08-0.12");
sheet.getRow(11).createCell(3).setCellValue("0.08-0.12");


sheet.getRow(13).createCell(3).setCellValue("0.01-0.05");
sheet.getRow(14).createCell(3).setCellValue("0.01-0.05");
sheet.getRow(15).createCell(3).setCellValue("0.01-0.05");

sheet.getRow(17).createCell(3).setCellValue("0.10-0.20");
sheet.getRow(18).createCell(3).setCellValue("0.10-0.20");
sheet.getRow(19).createCell(3).setCellValue("0.10-0.20");

sheet.getRow(21).createCell(3).setCellValue("0.08-0.15");
sheet.getRow(22).createCell(3).setCellValue("0.08-0.15");
sheet.getRow(23).createCell(3).setCellValue("0.08-0.15");
//设置表的列宽
sheet.setColumnWidth(0,256*23+184);
sheet.setColumnWidth(1,256*23+184);
sheet.setColumnWidth(2,256*23+184);
sheet.setColumnWidth(4,256*23+184);
sheet.setColumnWidth(5,256*23+184);
sheet.setColumnWidth(3,256*17+184);



return sheet;
}
}

教育核算表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package com.dwx.file;

import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class minban_jiaoyuhesuanbiao {

public XSSFSheet setSheet(XSSFWorkbook sheets){
String sheetName = "教育核定表";
int i,j;

XSSFSheet sheet = sheets.createSheet(sheetName);

//对第一行进行合并单元格
sheet.addMergedRegion(new CellRangeAddress(0,0,0,4));
sheet.addMergedRegion(new CellRangeAddress(1,1,0,4));
//给第一、二行添值
sheet.createRow(0).createCell(0).setCellValue("表一");
sheet.createRow(1).createCell(0).setCellValue("XXX学校2021年度教育培养、住宿成本生均核定表");
//给第一列添值
String[] list1 = new String[]{
"项目" ,
"一、基本情况" ,
"(一)标准学生数" ,
"1、小学" ,
"2、初中" ,
"3、高中" ,
"(二)教职工" ,
"1、小学" ,
"2、初中" ,
"3、高中" ,
"(三)占地面积" ,
"(四)建筑面积" ,
"二、成本构成" ,
"(一)人员支出" ,
"1、小学" ,
"2、初中" ,
"3、高中" ,
"(二)租赁费" ,
"1、小学" ,
"2、初中" ,
"3、高中" ,
"(三)财务费用" ,
"1、小学" ,
"2、初中" ,
"3、高中" ,
"(四)商品和服务支出" ,
"(五)固定资产折旧" ,
"三、生均成本"
};
int listLength = list1.length;
for (i = 0;i<listLength;i++){
sheet.createRow(i+2).createCell(0).setCellValue(list1[i]);
}
sheet.getRow(2).createCell(1).setCellValue("申报数");
sheet.getRow(2).createCell(2).setCellValue("核定数");
sheet.getRow(2).createCell(3).setCellValue("教育成本核定数");
sheet.getRow(2).createCell(4).setCellValue("住宿成本核定数");

//调整列表的宽
sheet.setColumnWidth(0,256*33+184);


return sheet;
}
}

参数表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
package com.dwx.file;

import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class minban_canshubiao {
public XSSFSheet setSheet(XSSFWorkbook sheets){
int j,i;
String sheetName = "参数表";
XSSFSheet sheet = sheets.createSheet(sheetName);
sheet.createRow(0).createCell(0).setCellValue("表:一");

sheet.addMergedRegion(new CellRangeAddress(1,1,0,14));
sheet.createRow(1).createCell(0).setCellValue("新乡市民办学校教育定价成本监审参数表");
//同理 有一个一系列的合并单元格
int[] list1 = new int[]{0,1,11,12,13};

for (i=0;i<=4;i++){
sheet.addMergedRegion(new CellRangeAddress(2,3,list1[i],list1[i]));
}
XSSFRow row = sheet.createRow(2);
String[] list2 = new String[]{"项 目","栏次及关系","总监审数","教育生均监审数","住宿生均监审数"};
for (i=0;i<=4;i++){
row.createCell(list1[i]).setCellValue(list2[i]);
}
row.createCell(14).setCellValue("备注");
sheet.getRow(2).createCell(2).setCellValue("2019年");
sheet.getRow(2).createCell(5).setCellValue("2020年");
sheet.getRow(2).createCell(8).setCellValue("2021年");
XSSFRow row1 = sheet.createRow(3);
for ( j = 1;j<=9;j++){
if (j%3 == 0){
row1.createCell(j+1).setCellValue("申报数");
}else if (j%3 == 2){
row1.createCell(j+1).setCellValue("核增核减数");
}else {
row1.createCell(j+1).setCellValue("核定数");
}
}
//给第一列和备注列添值
String[] list3 = new String[]{
"一、固定资产利用率" ,
"二、教学建筑面积占比" ,
"二、住宿建筑面积占比" ,
"三、行管分摊率" ,
"小学" ,
"初中" ,
"高中" ,
"四、教职工占比" ,
"小学" ,
"初中" ,
"高中" ,
"五、平均工资" ,
"六、招待费" ,
"七、培训费" ,
"八、工会经费" ,
"九、维修费" ,
"十、其它支出" ,
"十一、福利费" ,
"十二、"
};
String[] list4 = new String[]{
"不得低于80%。" ,
"" ,
"" ,
"均为1正确" ,
"" ,
"" ,
"" ,
"不得明显高于公办水准(标准120%)" ,
"标准:小学1:19" ,
"标准:初中1:13.5" ,
"标准:高中1:12.5" ,
"统计局:2019年71027元;2020年72261元;2021年?" ,
"年收入0.5%" ,
"人员工资总额的8%" ,
"人员工资总额的2%" ,
"不得高于固定资产原值的2%" ,
"不得高于公用支出(不含维修费)20%" ,
"人员工资总额的14%",
""
};
int list1Length = list3.length;
for (i = 0;i< list1Length;i++){
sheet.createRow(i+4).createCell(0).setCellValue(list3[i]);
sheet.getRow(i+4).createCell(1).setCellValue(i+1);
sheet.getRow(i+4).createCell(14).setCellValue(list4[i]);
}
//添加几个常数

sheet.getRow(12).createCell(2).setCellValue(19);
sheet.getRow(12).createCell(5).setCellValue(19);
sheet.getRow(12).createCell(8).setCellValue(19);

sheet.getRow(13).createCell(2).setCellValue(13.5);
sheet.getRow(13).createCell(5).setCellValue(13.5);
sheet.getRow(13).createCell(8).setCellValue(13.5);

sheet.getRow(14).createCell(2).setCellValue(12.5);
sheet.getRow(14).createCell(5).setCellValue(12.5);
sheet.getRow(14).createCell(8).setCellValue(12.5);
//设置表宽
sheet.setColumnWidth(0,256*24+184);





return sheet;
}
}

2022/3/3

公办的表都写好了

封面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package com.dwx.public_schools;

import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class cover {
public XSSFSheet setSheet(XSSFWorkbook sheets){
String sheetName = "封面";
XSSFSheet sheet = sheets.createSheet(sheetName);


//设置民办封面
//创建一个sheet
//封面的第一行是空着的
int i;
XSSFRow xssfRow;
XSSFCell xssfCell;
// 申请第一行 行和列都是从零开始的
XSSFRow row = sheet.createRow(0);
CellRangeAddress cellAddresses1 = new CellRangeAddress(0, 0, 0, 1);
sheet.addMergedRegion(cellAddresses1);
//第一行是四个cell
for ( i = 0;i<4;i++){
XSSFCell cell = row.createCell(i);
//第一行都是空着的 因此我们也把这个值设成空值
cell.setCellValue("");
}

//下边编写第二行
//第二行只用一列
//设置单元格的合并
CellRangeAddress cellAddresses = new CellRangeAddress(1, 1, 0, 5);
sheet.addMergedRegion(cellAddresses);
XSSFRow row1 = sheet.createRow(1);
XSSFCell cell = row1.createCell(0);
cell.setCellValue("新乡市民办学校教育定价成本监审表");

//第三行是一个空格行
CellRangeAddress cellAddresses2 = new CellRangeAddress(2, 2, 0, 5);
sheet.addMergedRegion(cellAddresses2);
XSSFRow row2 = sheet.createRow(2);
XSSFCell cell1 = row2.createCell(0);
cell1.setCellValue("");
//为第五后的合并单元格
for (i=3;i<=11;i++){
CellRangeAddress cellAddresses4 = new CellRangeAddress(i, i, 2, 4);
sheet.addMergedRegion(cellAddresses4);
}
//第五航到第12行
String[] name = new String[]{"学 校 名 称","法 定人 代 表","学 校 地 址","邮 政 编 码","财务负责人","填 表 人","电 话 ","邮 箱","传 真 "};
for (i = 3;i<=11; i++){
XSSFRow row4 = sheet.createRow(i);
XSSFCell cell4 = row4.createCell(1);
cell4.setCellValue(name[i-3]);

}
//第十三行是空格行
sheet.createRow(12);
//第十四行
XSSFRow row3 = sheet.createRow(13);
XSSFCell cell2 = row3.createCell(3);
cell2.setCellValue("学校盖章");
CellRangeAddress cellAddresses3 = new CellRangeAddress(13, 13, 3, 4);
sheet.addMergedRegion(cellAddresses3);
//第十五行

XSSFRow row4 = sheet.createRow(14);
XSSFCell cell3 = row4.createCell(3);
cell3.setCellValue(" 年");

XSSFCell cell4 = row4.createCell(4);
cell4.setCellValue(" 月 日");

//一下是对表格的宽度等的优化

//设置列宽

sheet.setColumnWidth(0, 258*23+184);
sheet.setColumnWidth(1, 258*23+184);
sheet.setColumnWidth(3, 258*13+184);
sheet.setColumnWidth(4, 258*13+184);
sheet.setColumnWidth(5, 258*28+184);

//设置行高
sheet.setDefaultRowHeight((short) 456);






return sheet;
}

}

基本表1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
package com.dwx.public_schools;

import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class sheet01 {
public XSSFSheet setSheet(XSSFWorkbook sheets){
String sheetName = "基本情况表1";
XSSFSheet sheet = sheets.createSheet(sheetName);

//设置表格的第一行
sheet.createRow(0).createCell(0).setCellValue("表:一");

//设置第二行 有一个大的合并单元格
sheet.addMergedRegion(new CellRangeAddress(1,1,0,9));
sheet.addMergedRegion(new CellRangeAddress(2,2,0,9));
sheet.createRow(1).createCell(0).setCellValue("XXX学校住宿定价成本监审学生人数调查表");
sheet.createRow(2).createCell(0).setCellValue("学校名称:(盖章) ");

//老朋友 一系列的小合并单元格
//老朋友 一系列合并单元格
sheet.addMergedRegion(new CellRangeAddress(3,4,0,0));
sheet.addMergedRegion(new CellRangeAddress(3,4,1,1));
sheet.addMergedRegion(new CellRangeAddress(3,4,9,9));
sheet.addMergedRegion(new CellRangeAddress(3,4,8,8));

// 又有一系列小的横向合并
for (int i=0;i<=4;i=i+2){
CellRangeAddress cellAddresses1 = new CellRangeAddress(3, 3, i+2, i+3);
sheet.addMergedRegion(cellAddresses1);
}
//添值
sheet.createRow(3).createCell(0).setCellValue("项 目");
sheet.getRow(3).createCell(1).setCellValue("栏次及关系");
sheet.getRow(3).createCell(8).setCellValue("总监审数");
sheet.getRow(3).createCell(9).setCellValue("备注");

sheet.getRow(3).createCell(2).setCellValue("2019年");
sheet.getRow(3).createCell(4).setCellValue("2020年");
sheet.getRow(3).createCell(6).setCellValue("2021年");
XSSFRow row = sheet.createRow(4);
for (int j = 0;j<6;j++){
if (j%2 == 0){
row.createCell(j+2).setCellValue("申报数");
}else {
row.createCell(j+2).setCellValue("核定数");
}
}
//设置第一列的值
String[] list1 = new String[]{
"一、规模房间数(间)" ,
"6人/间" ,
"8人/间" ,
"10人/间" ,
"三、规模人数" ,
"6人/间" ,
"8人/间" ,
"10人/间" ,
"四、实际房间数(间" ,
"6人/间" ,
"8人/间" ,
"10人/间" ,
"五、实际在校平均学生数" ,
"其中:年初学生数" ,
" 年末学生数" ,
"六、实际在校平均住宿标准学生数" ,
"其中:年初学生数" ,
" 年末学生数"
};
int listLength = list1.length;
for (int h = 1; h <= listLength;h++){
sheet.createRow(h+4).createCell(0).setCellValue(list1[h-1]);
sheet.getRow(h+4).createCell(1).setCellValue(h);
}

//在备注最后有两个合并单元格
sheet.addMergedRegion(new CellRangeAddress(17,19,9,9));
sheet.addMergedRegion(new CellRangeAddress(20,22,9,9));
sheet.getRow(17).createCell(9).setCellValue("按实际在校学生人数填写。");
sheet.getRow(20).createCell(9).setCellValue("按按实际在校住宿学生人数填写。");


//设置单元格的宽度
sheet.setColumnWidth(0,256*17+184);
sheet.setColumnWidth(2,256*12+184);
sheet.setColumnWidth(3,256*12+184);
sheet.setColumnWidth(4,256*12+184);
sheet.setColumnWidth(5,256*12+184);
sheet.setColumnWidth(6,256*12+184);
sheet.setColumnWidth(7,256*12+184);
sheet.setColumnWidth(8,256*12+184);
sheet.setColumnWidth(9,256*17+184);






return sheet;
}
}

基本表2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package com.dwx.public_schools;

import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class sheet02 {
public XSSFSheet setSheet(XSSFWorkbook sheets){

String sheetName = "基本情况表2";
XSSFSheet sheet = sheets.createSheet(sheetName);
sheet.createRow(0).createCell(0).setCellValue("表:二");
//编写第二行
//设置第二行 有一个大的合并单元格
sheet.addMergedRegion(new CellRangeAddress(1,1,0,9));
sheet.addMergedRegion(new CellRangeAddress(2,2,0,9));
sheet.createRow(1).createCell(0).setCellValue("XXX学校住宿定价成本监审学生人数调查表");
sheet.createRow(2).createCell(0).setCellValue("学校名称:(盖章) 单位:人学校名称:(盖章) 单位:人");

//老朋友 一系列的小合并单元格
//老朋友 一系列合并单元格
sheet.addMergedRegion(new CellRangeAddress(3,4,0,0));
sheet.addMergedRegion(new CellRangeAddress(3,4,1,1));
sheet.addMergedRegion(new CellRangeAddress(3,4,9,9));
sheet.addMergedRegion(new CellRangeAddress(3,4,8,8));

// 又有一系列小的横向合并
for (int i=0;i<=4;i=i+2){
CellRangeAddress cellAddresses1 = new CellRangeAddress(3, 3, i+2, i+3);
sheet.addMergedRegion(cellAddresses1);
}
//添值
sheet.createRow(3).createCell(0).setCellValue("项 目");
sheet.getRow(3).createCell(1).setCellValue("栏次及关系");
sheet.getRow(3).createCell(8).setCellValue("总监审数");
sheet.getRow(3).createCell(9).setCellValue("备注");

sheet.getRow(3).createCell(2).setCellValue("2019年");
sheet.getRow(3).createCell(4).setCellValue("2020年");
sheet.getRow(3).createCell(6).setCellValue("2021年");
XSSFRow row = sheet.createRow(4);
for (int j = 0;j<6;j++){
if (j%2 == 0){
row.createCell(j+2).setCellValue("申报数");
}else {
row.createCell(j+2).setCellValue("核定数");
}

}
//给第一列填值
String[] list1 = new String[]{
"一、教职工总数" ,
"(一)宿管人员数 " ,
"(二)维修人员数" ,
"(三)其它人员数" ,
"二、总建筑面积" ,
"(一)教学建筑面积" ,
"(二)住宿面积" ,
"(三)餐厅面积" ,
"三、固定资产原值" ,
"四、现执行收费标准"
};
int listLength = list1.length;
for (int h = 1; h <= listLength;h++){
sheet.createRow(h+4).createCell(0).setCellValue(list1[h-1]);
sheet.getRow(h+4).createCell(1).setCellValue(h);
}

//备注行由合并单元格
sheet.addMergedRegion(new CellRangeAddress(6,8,9,9));


sheet.getRow(6).createCell(9).setCellValue("其它人员:指保洁、保安等。此表格视情况而定,一般情况下不申报,特殊情况下可以研究。");

sheet.getRow(13).createCell(9).setCellValue("单位:万元");
sheet.getRow(14).createCell(9).setCellValue("单位:元/生.年");


sheet.setColumnWidth(0,256*17+184);
sheet.setColumnWidth(2,256*12+184);
sheet.setColumnWidth(3,256*12+184);
sheet.setColumnWidth(4,256*12+184);
sheet.setColumnWidth(5,256*12+184);
sheet.setColumnWidth(6,256*12+184);
sheet.setColumnWidth(7,256*12+184);
sheet.setColumnWidth(8,256*12+184);
sheet.setColumnWidth(9,256*17+184);
return sheet;
}

}

基本表3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
package com.dwx.public_schools;

import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class sheet03 {
public XSSFSheet setSheet(XSSFWorkbook sheets){

String sheetName = "三年相关科目调查表3";
XSSFSheet sheet = sheets.createSheet(sheetName);

sheet.createRow(0).createCell(0).setCellValue("表三");
sheet.addMergedRegion(new CellRangeAddress(1,1,0,10));
sheet.createRow(1).createCell(0).setCellValue("新乡市xxx学校财政审核后账册中相关科目基本情况表");
//创建我们的老朋友 一系列小合并单元格
sheet.addMergedRegion(new CellRangeAddress(2,3,0,0));

sheet.addMergedRegion(new CellRangeAddress(2,2,1,3));
sheet.addMergedRegion(new CellRangeAddress(2,2,4,6));
sheet.addMergedRegion(new CellRangeAddress(2,2,7,9));
sheet.createRow(2).createCell(1).setCellValue("2019年");
sheet.getRow(2).createCell(4).setCellValue("2020年");
sheet.getRow(2).createCell(7).setCellValue("2021年");
sheet.getRow(2).createCell(0).setCellValue("");
sheet.getRow(2).createCell(10).setCellValue("备注");

XSSFRow row = sheet.createRow(3);
for (int j = 1;j<=9;j++){
if (j%3 == 0){
row.createCell(j).setCellValue("申报数");
}else if (j%3 == 2){
row.createCell(j).setCellValue("核增核减数");
}else {
row.createCell(j).setCellValue("审定数");
}
}

//创建第一列
String[] list1 = new String[]{
"一、人员支出" ,
"(一)宿管人员数 " ,
"(二)维修人员数" ,
"(三)其它人员数" ,
"二、公用支出" ,
"1、维修费" ,
"2、水费" ,
"3、电费" ,
"4、垃圾清运费" ,
"5、" ,
"6、其它费用" ,
"三、合计"
};
int listLength = list1.length;;
for (int i =1;i<=listLength;i++){
sheet.createRow(i+3).createCell(0).setCellValue(list1[i-1]);
}
sheet.addMergedRegion(new CellRangeAddress(5,5,0,1));
sheet.addMergedRegion(new CellRangeAddress(6,6,0,1));
sheet.addMergedRegion(new CellRangeAddress(7,7,0,1));
sheet.addMergedRegion(new CellRangeAddress(5,7,10,10));
sheet.getRow(5).createCell(10).setCellValue("提供三类人员工资表");
sheet.addMergedRegion(new CellRangeAddress(8,14,10,10));
sheet.getRow(8).createCell(10).setCellValue("根据实际情况,可增加科目或另行加行。");


//设置单元格的宽度
sheet.setColumnWidth(0,256*14+186);
sheet.setColumnWidth(1,256*10+186);
sheet.setColumnWidth(2,256*10+186);
sheet.setColumnWidth(3,256*10+186);
sheet.setColumnWidth(4,256*10+186);
sheet.setColumnWidth(5,256*10+186);
sheet.setColumnWidth(6,256*10+186);
sheet.setColumnWidth(7,256*10+186);
sheet.setColumnWidth(8,256*10+186);
sheet.setColumnWidth(9,256*10+186);
sheet.setColumnWidth(10,256*14+186);



return sheet;
}
}

基本表4

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
package com.dwx.public_schools;

import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class sheet04 {
public XSSFSheet setSheet(XSSFWorkbook sheets){

String sheetName = "三年账册相关科目表4";
XSSFSheet sheet = sheets.createSheet(sheetName);
//设置第一行第一列
sheet.createRow(0).createCell(0).setCellValue("表:四");

sheet.addMergedRegion(new CellRangeAddress(1,1,0,10));
sheet.createRow(1).createCell(0).setCellValue("新乡市xxx学校账册相关科目基本情况调查表");
//老朋友来喽 一系列合并单元格
sheet.addMergedRegion(new CellRangeAddress(2,3,0,0));
sheet.createRow(2).createCell(0).setCellValue("科目");
sheet.addMergedRegion(new CellRangeAddress(2,2,1,3));
sheet.addMergedRegion(new CellRangeAddress(2,2,4,6));
sheet.addMergedRegion(new CellRangeAddress(2,2,7,9));
sheet.getRow(2).createCell(1).setCellValue("2019年");
sheet.getRow(2).createCell(4).setCellValue("2020年");
sheet.getRow(2).createCell(7).setCellValue("2021年");
sheet.createRow(3).createCell(10).setCellValue("备注");

XSSFRow row = sheet.getRow(3);

for (int j = 1;j<=9;j++){
if (j%3 == 0){
row.createCell(j).setCellValue("凭证类型");
}else if (j%3 == 2){
row.createCell(j).setCellValue("账册号");
}else {
row.createCell(j).setCellValue("金额");
}
}

//设置第一列
String[] list1 = new String[]{
"一、维修费" ,
"1、" ,
"2、" ,
"3、" ,
"4、" ,
"5、" ,
"6、" ,
"7、" ,
"8、" ,
"9、" ,
"10、" ,
"二、其它支出" ,
"1、" ,
"2、" ,
"3、" ,
"4、" ,
"5、" ,
"6、" ,
"7、" ,
"8、" ,
"9、" ,
"10、"
};
int listLength = list1.length;
for (int i = 1 ;i<= listLength;i++){
sheet.createRow(i+3).createCell(0).setCellValue(list1[i-1]);
}
//设置合并单元格
sheet.addMergedRegion(new CellRangeAddress(4,14,10,10));
sheet.addMergedRegion(new CellRangeAddress(15,25,10,10));
sheet.getRow(4).createCell(10).setCellValue("1、统计大于该科目金额20%的明细。2、凭证类型填写发票、合同(协议)、白条(收据)");
sheet.getRow(15).createCell(10).setCellValue("1、如果金额大于公用支出20%,请按内容分类。 如果金额小于公用支出20%,不填写。2、凭证类型填写发票、合同(协议)、白条(收据)");

sheet.setColumnWidth(0,256*12+186);
sheet.setColumnWidth(1,256*10+186);
sheet.setColumnWidth(2,256*10+186);
sheet.setColumnWidth(3,256*10+186);
sheet.setColumnWidth(4,256*10+186);
sheet.setColumnWidth(6,256*10+186);
sheet.setColumnWidth(7,256*10+186);
sheet.setColumnWidth(8,256*10+186);
sheet.setColumnWidth(9,256*10+186);
sheet.setColumnWidth(10,256*12+186);


return sheet;
}
}

附表1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
package com.dwx.public_schools;

import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class sheet05 {
public XSSFSheet setSheet(XSSFWorkbook sheets){
String sheetName = "住宿成本调查核算表";
XSSFSheet sheet = sheets.createSheet(sheetName);
sheet.createRow(0).createCell(0).setCellValue("附件1");
sheet.addMergedRegion(new CellRangeAddress(1,1,0,14));
sheet.addMergedRegion(new CellRangeAddress(2,2,0,14));
sheet.createRow(1).createCell(0).setCellValue("XXXXXX生均教育价格成本调查核算表");
sheet.createRow(2).createCell(0).setCellValue("学校名称:(盖章) 单位:元 ");

//啊哈哈哈 一系列合并单元格来喽~~~
sheet.addMergedRegion(new CellRangeAddress(3,4,0,0));
sheet.addMergedRegion(new CellRangeAddress(3,4,1,1));
sheet.addMergedRegion(new CellRangeAddress(3,4,11,11));
sheet.addMergedRegion(new CellRangeAddress(3,4,14,14));
sheet.createRow(3).createCell(0).setCellValue("项 目");
sheet.getRow(3).createCell(1).setCellValue("栏次及关系");
sheet.getRow(3).createCell(11).setCellValue("2021年度成本费用核定数");
sheet.getRow(3).createCell(14).setCellValue("备注");

sheet.addMergedRegion(new CellRangeAddress(3,3,2,4));
sheet.addMergedRegion(new CellRangeAddress(3,3,5,7));
sheet.addMergedRegion(new CellRangeAddress(3,3,8,10));
sheet.addMergedRegion(new CellRangeAddress(3,3,12,13));

sheet.getRow(3).createCell(2).setCellValue("2019年");
sheet.getRow(3).createCell(5).setCellValue("2020年");
sheet.getRow(3).createCell(8).setCellValue("2021年");
sheet.getRow(3).createCell(12).setCellValue("2021年度住宿成本核定数");

XSSFRow row = sheet.createRow(4);
for (int j = 2;j<=10;j++){
if (j%3 == 0){
row.createCell(j).setCellValue("核增核减数");
}else if (j%3 == 2){
row.createCell(j).setCellValue("申报数");
}else {
row.createCell(j).setCellValue("审定数");
}
}
row.createCell(12).setCellValue("住宿成本");
row.createCell(13).setCellValue("生均结论");

//设置第一列
String[] list1 = new String[]{
"一、人员支出" ,
"(一)宿管人员数 " ,
"(二)维修人员数" ,
"(三)其它人员数" ,
"二、公用支出" ,
"1、维修费" ,
"2、水费" ,
"3、电费" ,
"4、垃圾清运费" ,
"5、" ,
"6、其它费用" ,
"十二、生均合计"
};
int listLength = list1.length;
for (int i=0;i<listLength;i++){
sheet.createRow(i+5).createCell(0).setCellValue(list1[i]);
sheet.getRow(i+5).createCell(1).setCellValue(i+1);
}

sheet.addMergedRegion(new CellRangeAddress(5,8,13,13));
sheet.addMergedRegion(new CellRangeAddress(9,15,13,13));
sheet.addMergedRegion(new CellRangeAddress(10,15,14,14));
sheet.getRow(10).createCell(14).setCellValue("按建筑面积比进行分摊");

//创建列表的宽
sheet.setColumnWidth(0,256*13+186);
sheet.setColumnWidth(0,256*11+186);

return sheet;
}
}

附表2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package com.dwx.public_schools;

import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class sheet06 {
public XSSFSheet setSheet(XSSFWorkbook sheets){
String sheetName = "住宿成本报告核定表";
XSSFSheet sheet = sheets.createSheet(sheetName);

sheet.addMergedRegion(new CellRangeAddress(0,0,1,4));
sheet.addMergedRegion(new CellRangeAddress(1,1,1,4));

sheet.createRow(0).createCell(0).setCellValue("表一");
sheet.createRow(1).createCell(0).setCellValue("XXX学校2021年度住宿成本生均核定表");

sheet.createRow(2).createCell(0).setCellValue("项目");
sheet.getRow(2).createCell(1).setCellValue("栏次及关系");
sheet.getRow(2).createCell(2).setCellValue("申报数");
sheet.getRow(2).createCell(3).setCellValue("核定数");
sheet.getRow(2).createCell(4).setCellValue("备注");

String[] list1 = new String[]{
"一、基本情况" ,
"(一)标准学生数",
"其中:年初学生数" ,
" 年末学生数" ,
"(二)宿舍管理人员" ,
"(三)宿舍建筑面积" ,
"(四)标准间(人/间)" ,
"(五)房间数" ,
"二、成本构成" ,
"(一)人员支出" ,
"1、宿管人员数 " ,
"2、维修人员数" ,
"3、其它人员数" ,
"(二)公用支出" ,
"1、维修费" ,
"2、水费" ,
"3、电费" ,
"4、垃圾清运费" ,
"5、" ,
"6、其它费用" ,
"三、生均成本"
};
int listLength = list1.length;
int i =0;
for (i=0;i<listLength;i++){
sheet.createRow(i+3).createCell(0).setCellValue(list1[i]);
sheet.getRow(i+3).createCell(1).setCellValue(i+1);
}

sheet.setColumnWidth(0,256*19+186);
sheet.setColumnWidth(1,256*11+186);
sheet.setColumnWidth(2,256*14+186);
sheet.setColumnWidth(3,256*14+186);
sheet.setColumnWidth(4,256*14+186);


return sheet;
}
}

附表3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package com.dwx.public_schools;

import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class sheet07 {
public XSSFSheet setSheet(XSSFWorkbook sheets){

String sheetName = "参数表";
XSSFSheet sheet = sheets.createSheet(sheetName);

sheet.addMergedRegion(new CellRangeAddress(1,1,0,12));
sheet.createRow(1).createCell(0).setCellValue("新乡XXX学校住宿定价成本监审参数表");

//啊哈哈哈 一系列的合并单元格
sheet.addMergedRegion(new CellRangeAddress(2,3,0,0));
sheet.addMergedRegion(new CellRangeAddress(2,3,1,1));
sheet.addMergedRegion(new CellRangeAddress(2,3,11,11));
sheet.addMergedRegion(new CellRangeAddress(2,3,12,12));

sheet.createRow(2).createCell(0).setCellValue("项 目");
sheet.getRow(2).createCell(1).setCellValue("栏次及关系");
sheet.getRow(2).createCell(11).setCellValue("结论");
sheet.getRow(2).createCell(12).setCellValue("备注");

sheet.addMergedRegion(new CellRangeAddress(2,2,2,4));
sheet.addMergedRegion(new CellRangeAddress(2,2,5,7));
sheet.addMergedRegion(new CellRangeAddress(2,2,8,10));
sheet.getRow(2).createCell(2).setCellValue("2019年");
sheet.getRow(2).createCell(5).setCellValue("2020年");
sheet.getRow(2).createCell(8).setCellValue("2021年");

XSSFRow row = sheet.createRow(3);
for (int j = 2;j<=10;j++){
if (j%3 == 0){
row.createCell(j).setCellValue("申报数");
}else if (j%3 == 2){
row.createCell(j).setCellValue("核增核减数");
}else {
row.createCell(j).setCellValue("审定数");
}
}

//创建第一列
String[] list1 = new String[]{
"一、固定资产利用率" ,
"二、住宿建筑面积占比" ,
"三、住宿学生占比" ,
"四、维修费" ,
"五、其它支出" ,
"六、"
};
int listLength = list1.length;
for (int j = 1;j <= listLength;j++){

sheet.createRow(j+3).createCell(0).setCellValue(list1[j-1]);
sheet.getRow(j+3).createCell(1).setCellValue(j);
}
sheet.getRow(4).createCell(12).setCellValue("不得低于80%。");
sheet.getRow(7).createCell(12).setCellValue("不得高于固定资产原值的2%");

sheet.setColumnWidth(0,256*15+186);
sheet.setColumnWidth(2,256*9+186);
sheet.setColumnWidth(3,256*9+186);
sheet.setColumnWidth(4,256*9+186);
sheet.setColumnWidth(5,256*9+186);
sheet.setColumnWidth(6,256*9+186);
sheet.setColumnWidth(7,256*9+186);
sheet.setColumnWidth(8,256*9+186);
sheet.setColumnWidth(9,256*9+186);
sheet.setColumnWidth(10,256*9+186);
sheet.setColumnWidth(11,256*9+186);
sheet.setColumnWidth(12,256*9+186);

return sheet;
}
}

SSM框架下的项目前后端的结合

SSM框架下的项目前后端的结合

对于前后端结合莫非两个步骤:

  • 编写对应的Controller层
  • 编写前端

查询书籍功能的实现

编写controller层

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package com.dwx.controller;

import com.dwx.pojo.Books;
import com.dwx.service.BooksService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.List;

//此处我们使用注解开发
@Controller
@RequestMapping("/books")
public class BooksController {

@Autowired
private BooksService booksService;


//对于Controller层 他的工作是调用Service层,因此将service作为参数
@RequestMapping("allBooks")
public String queryAllBooks(Model model){
List<Books> books = booksService.queryBooks();
model.addAttribute("books",books);
return "books";

}

}

编写前端代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
Created by IntelliJ IDEA.
User: Lenovo
Date: 2022/2/22
Time: 20:25
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>查询书籍页面</title>
<!-- 引入 Bootstrap -->

</head>
<body>
<div>
<div>
<table>
<thead>
<tr>
<th>书籍编号</th>
<th>书籍名称</th>
<th>书籍数目</th>
<th>书籍细节</th>
</tr>

</thead>
<tbody>
<c:forEach var="book" items="${books}">
<tr>
<td>${book.bookID}</td>
<td>${book.bookName}</td>
<td>${book.bookCounts}</td>
<td>${book.detail}</td>
</tr>
</c:forEach>
</tbody>
</table>
</div>
</div>
</body>
</html>

其他的功能都是类似操作,不再进行展示

SSM框架的整合

SSM框架的整合

我的学习博客: 狂神说SpringMVC05:整合SSM框架 (qq.com)

我是根据这个博客学的

说是SSM框架的整合,其实还是重新创建一个项目,正好学习从0开始写一个项目的方法。

环境要求

  • IDEA
  • maven 3.6(以上)
  • Tomact9 (以下)
  • MySQL 5.7(以上)

第一步,分析需求设计数据库

我们这里仅仅创建一个非常简单ed图书管理系统,创建一个非常简单的数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE DATABASE ssmbuild;
USE ssmbuild;
CREATE TABLE `books`(
`bookID` INT NOT NULL AUTO_INCREMENT COMMENT '书id',
`bookName` VARCHAR(100) NOT NULL COMMENT '书名',
`bookCounts` INT NOT NULL COMMENT '数量',
`detail` VARCHAR(200) NOT NULL COMMENT '描述',
KEY `bookID`(`bookID`)
)ENGINE=INNODB DEFAULT CHARSET=utf8;

INSERT INTO `books`(`bookID`,`bookName`,`bookCounts`,`detail`)VALUES
(1,'Java',1,'从入门到放弃'),
(2,'MySQL',10,'从删库到跑路'),
(3,'Linux',5,'从进门到进牢')

数据库样貌

第二步,创建javaweb项目

修改web.xml文件中的配置

1
2
3
4
5
6
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">

</web-app>

第三步,导入环境依赖

包括;

  • junit
  • 数据驱动和连接池
  • servlet
  • jsp
  • mybatis
  • mybatis-Spring
  • Spring的一系列包
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.4</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>有提示</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.2</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>

</dependencies>

并且顺手处理了可能存在的mybatis环境不仅如此target问题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>

第四步,链接数据库

连接数据库

第五步,编写包结构

我们创建一个程序,最基础的包结构有:

  • Mapper(永久层)
  • POJO(实体类)
  • service
  • Controller(原 servlet)

以及在resource下创建;

  • mybatis-config.xml(mybatis的核心配置文件)
  • applicationContext.xml(Spring的核心配置文件)

并导入他们的配置头文件

完整的包结构

mybatis-config.xml

1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

</configuration>

applicationContext.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">


</beans>

第六步,mybatis关联数据库

在resource下创建db.properties文件,并且写入链接数据库所需的一切参数

1
2
3
4
driver = com.mysql.cj.jdbc.Driver
url = jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEnconding=utf8&useSSL=true
username = dwx
password = 123456

本身是需要在mybatis中关联的,但是由于我们使用Spring整合了mybatis,这部分内容就不需要mybatis做了,mybatis只需要对别名进行处理,或者注册mapper.xml

此时的mybatis-config.xml文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

<!--联结数据库的工作交给Spring-->


<!--使用别名 对实体类使用别名-->
<typeAliases>
<package name="com.dwx.pojo"/>
</typeAliases>
<!--注册mapper.xml-->


</configuration>

第七步,编写pojo类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package com.dwx.pojo;

public class Books {
private int bookID;
private String bookName;
private int bookCounts;
private String detail;

public Books(int bookID, String bookName, int bookCounts, String detail) {
this.bookID = bookID;
this.bookName = bookName;
this.bookCounts = bookCounts;
this.detail = detail;
}

public Books() {
}

public int getBookID() {
return bookID;
}

public void setBookID(int bookID) {
this.bookID = bookID;
}

public String getBookName() {
return bookName;
}

public void setBookName(String bookName) {
this.bookName = bookName;
}

public int getBookCounts() {
return bookCounts;
}

public void setBookCounts(int bookCounts) {
this.bookCounts = bookCounts;
}

public String getDetail() {
return detail;
}

public void setDetail(String detail) {
this.detail = detail;
}

@Override
public String toString() {
return "Books{" +
"bookID=" + bookID +
", bookName='" + bookName + '\'' +
", bookCounts=" + bookCounts +
", detail='" + detail + '\'' +
'}';
}
}

此处我们没有使用注解开发,如果使用注解就要导入Lombok的·包,

具体过程如这篇博客: Lombok插件的使用 | dwx-tx的小天地

要求:实体类的参数的类型的名字要与数据库中的一致。

第八步,接口实现操作

在Dao层创建接口,写出预计的操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package com.dwx.mapper;

import com.dwx.pojo.Books;
import org.apache.ibatis.annotations.Param;

import java.awt.print.Book;
import java.util.List;

public interface BooksMapper {

//接口实现操作
//增加书籍操作
int addBook(Books books);

//删除书籍操作:通过ID
int deleteBook(@Param("bookID") int id);

//修改图书信息
int updateBook(Books books);

//查询书籍byID
Books queryBook(@Param("bookID") int id);

//查询所有的数据
List<Books> queryBooks();
}

此处使用@Param("")表示以后参数可以使用别名

第九步,编写实现Mapper

此时就用到Mybatis了,在Mapper层下创造一个和接口同名的xml文件,并且导入Mapper配置。

修改<mapper></mapper>的命名空间为接口的名字

1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dwx.mapper.BooksMapper">

</mapper>

编写SQL,实现sql

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dwx.mapper.BooksMapper">

<!--增加书籍操作-->
<insert id="addBook" parameterType="books">
insert into ssmbuild.books (bookName,bookCounts,detail)
VALUES #{bookName},#{bookCounts},#{detai});
</insert>

<!--删除书籍操作-->
<delete id="deleteBook" parameterType="int">
delete from ssmbuild.books
where bookID = #{bookID};
</delete>

<!--修改图书信息-->
<update id="updateBook" parameterType="books">
update ssmbuild.books
set bookName = #{bookName},bookCounts = #{bookCounts},detail = #{detail}
where bookID = #{bookID};
</update>

<!--查询书籍ByID-->
<select id="queryBook" parameterType="int" resultType="books">
select * from ssmbuild.books where bookID = #{bookID};
</select>

<!--查询所有的书籍-->
<select id="queryBooks" resultType="books">
select * from ssmbuild.books;
</select>

</mapper>

实现的xml编写完后,要迅速到mybatis-config.xml中进行配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

<!--联结数据库的工作交给Spring-->


<!--使用别名 对实体类使用别名-->
<typeAliases>
<package name="com.dwx.pojo"/>
</typeAliases>
<!--注册mapper.xml-->
<mappers>
<mapper class="com.dwx.mapper.BooksMapper"/>
</mappers>


</configuration>

第十步,编写service层(接口加实现类)

service层的唯一作用就是链接DAO层,将数据传递到Controller层,因此,在service层中需要调用DAO层(引用这个层)

接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package com.dwx.service;

import com.dwx.pojo.Books;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface BooksService {

//service层做得工作和Dao层差不多


int addBook(Books books);

//删除书籍操作:通过ID
int deleteBook(@Param("bookID") int id);

//修改图书信息
int updateBook(Books books);

//查询书籍byID
Books queryBook(@Param("bookID") int id);

//查询所有的数据
List<Books> queryBooks();
}

实现类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package com.dwx.service;

import com.dwx.mapper.BooksMapper;
import com.dwx.pojo.Books;

import java.util.List;

public class BookServiceImpl implements BooksService{

//调用DAO层
private BooksMapper booksMapper;
//由于是使用mybatis,因此一定要使用set方法,因为mybatis是支持set注入的
public void setBooksMapper(BooksMapper booksMapper) {
this.booksMapper = booksMapper;
}

//此时使用这个mapper对象就能实现操作了

@Override
public int addBook(Books books) {
return booksMapper.addBook(books);
}

@Override
public int deleteBook(int id) {
return booksMapper.deleteBook(id);
}

@Override
public int updateBook(Books books) {
return booksMapper.updateBook(books);
}

@Override
public Books queryBook(int id) {
return booksMapper.queryBook(id);
}

@Override
public List<Books> queryBooks() {
return booksMapper.queryBooks();
}
}

第十一步,整合Spring

spring能够整合每一层,并且在每一层都创建一个xml

Spring整合DAO层

创建SpringDAO/mapper.xml并且导入依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">


</beans>


对于这个xml要做到的功能如下:

  • 关联数据库配置文件

  • 链接池

  • SqlSessionFactory

  • 将DAO接口注入到Spring容器中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<!--关联数据库配置文件-->
<context:property-placeholder location="classpath:db.properties"/>
<!--连接池-->
<!--这个c3j0数据库源有问题,我们使用我们Mybatis默认的数据源-->
<!--&lt;!&ndash; 这里我们使用的链接池是c3j0&ndash;&gt;-->
<!-- <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">-->
<!-- <property name="driverClass" value="${driver}"/>-->
<!-- <property name="password" value="${password}"/>-->
<!-- <property name="user" value="${username}"/>-->
<!-- <property name="jdbcUrl" value="${url}"/>-->
<!-- &lt;!&ndash;对这个连接池进行一点个性化配置&ndash;&gt;-->
<!-- &lt;!&ndash; c3p0连接池的私有属性 &ndash;&gt;-->
<!-- <property name="maxPoolSize" value="30"/>-->
<!-- <property name="minPoolSize" value="10"/>-->
<!-- &lt;!&ndash; 关闭连接后不自动commit &ndash;&gt;-->
<!-- <property name="autoCommitOnClose" value="false"/>-->
<!-- &lt;!&ndash; 获取连接超时时间 &ndash;&gt;-->
<!-- <property name="checkoutTimeout" value="10000"/>-->
<!-- &lt;!&ndash; 当获取连接失败重试次数 &ndash;&gt;-->
<!-- <property name="acquireRetryAttempts" value="2"/>-->
<!-- </bean>-->
<!--整合数据库 数据源-->
<!--mybatis的默认数据库池-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;characterEnconding=utf8&amp;useSSL=truejdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;characterEnconding=utf8&amp;useSSL=true"/>
<property name="username" value="dwx"/>
<property name="password" value="123456"/>
</bean>
<!--sqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--链接数据源-->
<property name="dataSource" ref="dataSource"/>
<!--绑定mybatis配置文件-->
<property name="configLocation" value="classpath:mybatis-config.xml"/>

</bean>
<!--配置永久层扫描包(动态的实现DAO接口可以注入到Spring容器中)-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--注入SQLSessionFactory-->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<!--配置要扫描的包-->
<property name="basePackage" value="com.dwx.mapper"/>
</bean>

</beans>



Spring整合service层

步奏:

  • 扫描service层下的包
  • 在service类上加上@Service表示被Spring托管
  • 将所有的业务类注册到Spring中
  • 声明式事务配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<!--扫描Service的包-->
<context:component-scan base-package="com.dwx.service"/>
<!--将我们的业务类都朱擦到Spring中-->
<bean id="BooksServiceImpl" class="com.dwx.service.BookServiceImpl">
<!--Spring注入参数Mapper-->
<property name="booksMapper" ref="booksMapper"/>
</bean>
<!--声明式事务配置-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--绑定数据源-->
<property name="dataSource" ref="dataSource"/>
</bean>
</beans>


第十二步,整合SpringMVC

SpringMVC整合步奏:

  • 将web.xml文件换成最新的
  • 配置DispatchServlet
  • 解决乱码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<!--注册DispatcherServlet及其一些配置-->
<servlet>
<servlet-name>Spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Spring</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--解决乱码问题-->
<filter>
<filter-name>encoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

</web-app>

我们看这个配置,有一个classpath:springmvc-servlet.xml

这里是我们Spring整合Controller层,我们去编写这个

它要做到的事情:

  • 注解驱动
  • 扫描包
  • 静态资源过滤
  • 视图解析器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">

<!--由于我们时使用的注解开发,因此需要添加配置 扫描要添加注解的包-->
<context:component-scan base-package="com.dwx.controller"/>
<!--让SpringMVC不处理静态资源-->
<mvc:default-servlet-handler/>
<!--这里我们使用下边这个配置代替 添加处理映射器 添加处理适配器-->
<mvc:annotation-driven/>

<!--编写适配视图解析器-->

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>


</beans>


第十三步,将我们写的几个子xml全部导入到Spring的核心配置文件中去

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<import resource="spring-mapper.xml"></import>
<import resource="spring-service.xml"></import>
<import resource="springmvc-servlet.xml"></import>
</beans>



到此时我们的SSM框架就彻底整合完毕了

对于JSON的浅薄理解

对于JSON的浅薄理解

后端如果使用java写,后端数据的类型是基本数据类型加上自己创建的应用类型

前端使用的数据类型,并不存在数据类型 没有特定的规定。

前端和后端的数据怎么正确传输?

JSON的作用

json:

  • 是一种轻量级的数据交换格式
  • 采用完全独立于编程语言的文本格式
  • JSON内有键值对的向欧盟和瑟吉欧

JSON不是编程语言,是传递数据的格式,,对于JSON的使用,需要JSON的解析工具。

常用的JSON解析工具有两个:JackSon和FastJson

jackSon的使用

这里我们依旧采用应用的方式来讲解:

JSON的方法经常用的就是把java转化成String然后传递给前端。

使用JackSon需要导入依赖

1
2
3
4
5
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.1</version>
</dependency>

创建一个SpringMVC程序,过程如这篇博客: HelloSpringMVC | dwx-tx的小天地

1
@ResponseBody

这就能保证return 不再是重定向,而是将值返回到前端。

这就不难解释,我在写自己的项目的时候,能够将文件直接返回到前端。

1
2
3
4
5
6
@ResponseBody
public String JackSon(Model model){

User user = new User("dwx", 1900, 19);
return user.toString();
}

json的基本原理就是将对象转化成一个字符串然后返回到去前端

1
2
3
4
5
6
7
8
9
10
11
12
@RequestMapping("/h1")
@ResponseBody
public String JackSon(Model model) throws JsonProcessingException {

User user = new User("dwx", 1900, 19);

//使用JSON
ObjectMapper mapper = new ObjectMapper();
String s = mapper.writeValueAsString(user);

return s;
}

使用JSON,JSON不仅仅可以作用于一个对象,也能作用于LIST

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@RequestMapping("/h1")
@ResponseBody
public String JackSon(Model model) throws JsonProcessingException {

User user = new User("dwx", 1900, 19);
User user1 = new User("dwx1", 1900, 19);
User user2 = new User("dwx2", 1900, 19);

List<User> UserList = new ArrayList<>();


UserList.add(user);
UserList.add(user1);
UserList.add(user2);
//使用JSON
ObjectMapper mapper = new ObjectMapper();
String s = mapper.writeValueAsString(UserList);

return s;
}

JSON中文乱码问题

对于JSON的乱码,使用过滤器无法解决这个问题,但是JSON给出了解决方法

使用注解解决

@RequestMappering中有一个produces属性,我们可以通过这个属性来实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@Controller
public class MyController {

@RequestMapping(value = "/h1",produces = "application/json;charset-utf-8")
@ResponseBody
public String JackSon(Model model) throws JsonProcessingException {

User user = new User("党文轩", 1900, 19);
User user1 = new User("德行1", 1900, 19);
User user2 = new User("等我下", 1900, 19);

List<User> UserList = new ArrayList<>();


UserList.add(user);
UserList.add(user1);
UserList.add(user2);
//使用JSON
ObjectMapper mapper = new ObjectMapper();
String s = mapper.writeValueAsString(UserList);

return s;
}

}

这里的问题在于,这个注释可能会重写很多遍,因此SpringMVC提供了在Springxml文件中配置的方法解决这个问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="UTF-8"/>
</bean>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper">
<bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
<property name="failOnEmptyBeans" value="false"/>
</bean>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>

固定格式,不需要做任何的更改

FastJson

FASTJSON是阿里自己的JSON编译器,但是由于他的功能和我们使用的JackSon差不多,这里我们就不讲了

可以参考这个博客: fastjson的基本使用方法

  • Copyrights © 2015-2023 dwx
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信