1、引言
在工作和学习中,我们经常使用到excel表格,有时候表格中的数据很多,此时我们就希望能够通过程序去控制某些表格数据的生成和修改,从而达到简化操作,缩减工作量的目的,这里就来简单实现一下对excel表格数据的写入操作。
2、jar包引入
这里我是在android中使用poi.jar来实现,如果在maven项目中也一样,直接引入poi的相关依赖就行,在android要使用两个jar包,分别是poi-android.jar和poi-ooxml-schemas.jar,这两个jar包在文章末尾提供的源码下载地址中下载源码获取,jar包就在源码中。
3、代码实现
package xyz.dritrtj.excel;
import androidx.appcompat.app.AppCompatActivity;
import android.graphics.Color;
import android.graphics.Point;
import android.os.Bundle;
import android.view.Display;
import android.view.Gravity;
import android.view.View;
import android.widget.Toast;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
import java.io.File;
import java.io.FileOutputStream;
import xyz.dritrtj.excel.interfaces.Init;
import xyz.dritrtj.excel.utils.SetUiSize;
public class MainActivity extends AppCompatActivity implements Init {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
setViewSize();
setData();
}
/**
* 生成excel表格
* @param path
*/
private void initWorkbook(File path) {
HSSFWorkbook wb = new HSSFWorkbook();
//标题栏单元格样式
HSSFCellStyle cellStyle = wb.createCellStyle();
cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);//居中显示
HSSFFont font = wb.createFont();
font.setFontName("黑体");
font.setFontHeightInPoints((short) 16);
cellStyle.setFont(font);
//创建execl中的一个表,就是excel下面的一个工作簿
Sheet sheet = wb.createSheet();
wb.setSheetName(0, "my-test");
//创建标题栏1
Row titleRow1 = sheet.createRow(0);//创建第一行
//设置样式优先以单元格为主,创建的单元格会覆盖默认行样式
// 设置标题栏高度,也就是这一行的高度
titleRow1.setHeightInPoints(24);
//创建标题栏第1个标题
for (int i = 0; i < 6; i++) {
titleRow1.createCell(i)
.setCellValue("");//设置当前单元格的值
}
Cell cellTitle = titleRow1.createCell(6);
cellTitle.setCellValue("镇雄县学生营养改善计划食品学校自行采购清单");//设置当前单元格的值
cellTitle.setCellStyle(cellStyle);
//设置单元格占据的大小,使用它可以合并单元格,下面的值代表单元格占据的位置
sheet.addMergedRegion(CellRangeAddress.valueOf("$G$1:$O$1"));
Row titleRow2 = sheet.createRow(1);//创建第二行
titleRow2.createCell(0)
.setCellValue("");//设置当前单元格的值
titleRow2.createCell(1)
.setCellValue("附加信息:");//设置当前单元格的值
//设置单元格占据的大小,使用它可以合并单元格,下面的值代表单元格占据的位置
sheet.addMergedRegion(CellRangeAddress.valueOf("$B$2:$D$2"));
titleRow2.createCell(4)
.setCellValue("");//设置当前单元格的值
titleRow2.createCell(5)
.setCellValue("");//设置当前单元格的值
titleRow2.createCell(6)
.setCellValue("供餐学校:");//设置当前单元格的值
//设置单元格占据的大小,使用它可以合并单元格,下面的值代表单元格占据的位置
sheet.addMergedRegion(CellRangeAddress.valueOf("$G$2:$H$2"));
titleRow2.createCell(8)
.setCellValue("");//设置当前单元格的值
titleRow2.createCell(9)
.setCellValue("入库日期:2023年 月 日");//设置当前单元格的值
//设置单元格占据的大小,使用它可以合并单元格,下面的值代表单元格占据的位置
sheet.addMergedRegion(CellRangeAddress.valueOf("$J$2:$O$2"));
Row titleRow3 = sheet.createRow(2);//创建第三行
titleRow3.createCell(0)
.setCellValue("序号");//设置当前单元格的值
titleRow3.createCell(1)
.setCellValue("收货入库时间");//设置当前单元格的值
titleRow3.createCell(2)
.setCellValue("独立核算学校");//设置当前单元格的值
titleRow3.createCell(3)
.setCellValue("供餐校点名称");//设置当前单元格的值
titleRow3.createCell(4)
.setCellValue("食材编码");//设置当前单元格的值
titleRow3.createCell(5)
.setCellValue("食材类别");//设置当前单元格的值
titleRow3.createCell(6)
.setCellValue("食材名称");//设置当前单元格的值
titleRow3.createCell(7)
.setCellValue("单位");//设置当前单元格的值
titleRow3.createCell(8)
.setCellValue("单价(元)");//设置当前单元格的值
titleRow3.createCell(9)
.setCellValue("数量");//设置当前单元格的值
titleRow3.createCell(10)
.setCellValue("金额(元)");//设置当前单元格的值
titleRow3.createCell(11)
.setCellValue("检验是否合格");//设置当前单元格的值
titleRow3.createCell(12)
.setCellValue("供货(单位)人");//设置当前单元格的值
titleRow3.createCell(13)
.setCellValue("供货人电话");//设置当前单元格的值
titleRow3.createCell(14)
.setCellValue("所索证件名称");//设置当前单元格的值
titleRow3.createCell(15)
.setCellValue("收货入库辅助列(禁止修改或删除)");//设置当前单元格的值
//设置单元格占据的大小,使用它可以合并单元格,下面的值代表单元格占据的位置
sheet.addMergedRegion(CellRangeAddress.valueOf("$P$3:$R$3"));
Row titleRow4 = sheet.createRow(3);//创建第四行
titleRow4.createCell(0)
.setCellValue("1");//设置当前单元格的值
titleRow4.createCell(1)
.setCellValue("1月2日");//设置当前单元格的值
titleRow4.createCell(2)
.setCellValue("镇雄县场坝镇中心学校");//设置当前单元格的值
titleRow4.createCell(3)
.setCellValue("镇雄县场坝镇摩多小学");//设置当前单元格的值
titleRow4.createCell(4)
.setCellValue("z1101");//设置当前单元格的值
titleRow4.createCell(5)
.setCellValue("");//设置当前单元格的值
titleRow4.createCell(6)
.setCellValue("蔬菜辣椒");//设置当前单元格的值
titleRow4.createCell(7)
.setCellValue("斤");//设置当前单元格的值
titleRow4.createCell(8)
.setCellValue("1");//设置当前单元格的值
titleRow4.createCell(9)
.setCellValue("2");//设置当前单元格的值
titleRow4.createCell(10)
.setCellValue("2");//设置当前单元格的值
titleRow4.createCell(11)
.setCellValue("是");//设置当前单元格的值
titleRow4.createCell(12)
.setCellValue("XXX");//设置当前单元格的值
titleRow4.createCell(13)
.setCellValue("12222222");//设置当前单元格的值
titleRow4.createCell(14)
.setCellValue("122222");//设置当前单元格的值
titleRow4.createCell(15)
.setCellValue("2024年1月");//设置当前单元格的值
titleRow4.createCell(16)
.setCellValue("星期二");//设置当前单元格的值
writeFile(wb, path);
}
/**
* 将Excle表格写入文件中
* @param workbook
* @param fileName
*/
private static void writeFile(Workbook workbook, File fileName) {
FileOutputStream outputStream = null;
try {
outputStream = new FileOutputStream(fileName);
workbook.write(outputStream);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (outputStream != null) {
outputStream.close();
}
if (workbook != null) {
workbook.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
@Override
public void initView() {
View decorView=getWindow().getDecorView();//获取当前界面的DecorView
int option=View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;//更改文字颜色为深黑色
decorView.setSystemUiVisibility(option);//设置系统UI元素的可见性
getWindow().setNavigationBarColor(Color.TRANSPARENT);
getWindow().setStatusBarColor(Color.parseColor("#ffffff"));//将状态栏设置为白色
getSupportActionBar().hide();
//获取屏幕宽度
Display display= getWindowManager().getDefaultDisplay();
Point point=new Point();
display.getSize(point);
SetUiSize.displayWidth=display.getWidth();
SetUiSize.displayHeight=display.getHeight();
}
@Override
public void setViewSize() {
}
@Override
public void setData() {
File file=new File(getExternalFilesDir(null),"my.xlsx");
initWorkbook(file);
}
/**
* 信息提示
* @param message
*/
private void tip(final String message){
runOnUiThread(() -> {
//更改默认Toast显示方式,需要什么直接调用方法就行
Toast toast=Toast.makeText(MainActivity.this,
message,Toast.LENGTH_SHORT);
toast.setGravity(Gravity.TOP,
0, (int) (SetUiSize.displayHeight*0.4));
toast.show();
});
}
}
4、注意事项
关于单元格中样式会有覆盖的情况,行样式会覆盖工作簿样式,单元格会覆盖工作簿样式和行样式,不管你是否设置样式都会覆盖,因此对样式要针对单元格设置,在覆盖时只会由代码直接生成的单元格或者行覆盖默认样式,对单元格或者行设置样式都是通过cellTitle.setCellStyle(cellStyle);方法设置,设置样式参照这个就行。
5、效果
6、源码下载地址
下载地址如下:
code.drjtrtj.xyz/downCode?id=6