Unity3D特效百例 | 案例项目实战源码 | Android-Unity实战问题汇总 |
---|---|---|
游戏脚本-辅助自动化 | Android控件全解手册 | 再战Android系列 |
Scratch编程案例 | 软考全系列 | Unity3D学习专栏 |
蓝桥系列 | ChatGPT和AIGC |
👉关于作者
专注于Android/Unity和各种游戏开发技巧,以及各种资源分享(网站、工具、素材、源码、游戏等)
有什么需要欢迎底部卡片私我,交流让学习不再孤单。
👉实践过程
Apache POI 是 Java 领域最完善的 Office 文件读写库
依赖包 | 前置条件 |
---|---|
poi-scratchpad | poi |
poi-ooxml | poi, poi-ooxml-schemas |
poi-ooxml-schemas | xmlbeans |
poi-examples | poi, poi-scratchpad, poi-ooxml |
ooxml-schemas | xmlbeans |
类型 | 文件类型 |
---|---|
POIFS | OLE2 Filesystem |
HPSF | OLE2 Property Sets |
HSSF | Excel XLS |
HSLF | PowerPoint PPT |
HWPF | Word DOC |
HDGF | Visio VSD |
HPBF | Publisher PUB |
HSMF | Outlook MSG |
OpenXML4J | OOXML |
XSSF | Excel XLSX |
XSLF | PowerPoint PPTX |
XWPF | Word DOCX |
Common SS | Excel XLS and XLSX |
当只要使用xls格式时、只要导入 POI 即可;
当还要使用xlsx格式、还要导入 poi-ooxml;
当需要操作 word、ppt、viso、outlook 等时需要用到 poi-scratchpad。
同样适用于 Android 领域,但是由于 JDK 和 AndroidSDK 在源码上存在差异,所以原版的 Apache POI 库,并不能直接在安卓上使用
两个Jar包,poi-android.jar 和 poi-ooxml-schemas.jar
这里我们用的是修改和精简过后,适合安卓的版本。POI 是3.12版本的,它不是 Apache 官方 POI 包,截止2023年11月我仍然在使用该 Jar 包开发应用,并且没有遇到什么问题。
需要 Jar 包的欢迎文章最底部卡片 Call 我。
java
dependencies {
implementation files('libs\\poi-3.12-android-a.jar')
implementation files('libs\\poi-ooxml-schemas-3.12-20150511-a.jar')
}
文档 API 可以参考这里,特别注意我们使用的 POI 包不是 Apache 软件基金会的,部分方法及其功能会有所不同!!!
API:
- HSSF - 提供读写Microsoft Excel格式档案的功能。
- XSSF - 提供读写Microsoft Excel OOXML格式档案的功能。
- HWPF - 提供读写Microsoft Word格式档案的功能。
- HSLF - 提供读写Microsoft PowerPoint格式档案的功能。
- HDGF - 提供读写Microsoft Visio格式档案的功能。
HSSF
用来操作Office 2007版本前excel.xls文件,XSSF用来操作Office 2007版本后的excel.xlsx文件。HSSF在org.apache.poi.hssf.usermodel包中,实现Workbook 接口,常用组件:
HSSFWorkbook excel的文档对象
HSSFSheet excel的表单
HSSFRow excel的行
HSSFCell excel的格子单元
HSSFFont excel字体
HSSFDataFormat 日期格式
HSSFHeader sheet头
HSSFFooter sheet尾(只有打印的时候才能看到效果)
HSSFCellStyle cell样式
HSSFDateUtil 日期
HSSFPrintSetup 打印
HSSFErrorConstants 错误信息表
XSSF
在org.apache.xssf.usemodel包,实现Workbook接口,常用组件:
XSSFWorkbook excel的文档对象
XSSFSheet excel的表单
XSSFRow excel的行
XSSFCell excel的格子单元
XSSFFont excel字体
XSSFDataFormat 日期格式
和HSSF类似;
java
workbook = new XSSFWorkbook(inputStream); //创建.xlsx格式文件对象
workbook = new HSSFWorkbook(inputStream); //创建.xls格式文件对象
Sheet sheetAt = workbook.getSheetAt(0); //获取工作表的对象
Row row = sheetAt.getRow(0); //获取工作表的行
int physicalNumberOfCells = row.getPhysicalNumberOfCells(); //获取实际单元格数
Row.getCell(i); //获取工作表的单元格
Cell.getCellType(); //获得单元格格式
java
Cell.getBooleanCellValue();//获取布尔类型的单元格
Cell.getNumericCellValue();//获取数字类型的单元格
Cell.getDateCellValue();//获取日期类型的单元格
Cell.getNumericCellValue();//获取数值类型的单元格
Cell.getStringCellValue();//获取字符串类型的单元格
SheetAt.getPhysicalNumberOfRows(); //获取实际行数
java
//创建工作表的名字
XSSFSheet sheet = workbook.createSheet(WorkbookUtil.createSafeSheetName("Sheet1"));
java
Row row = sheet.createRow(int i); // 创建行
Cell cell = row.createCell(int i); // 创建列
Cell.setCellValue((String) map.get(j)); // 将需要添加到Excel的文本添加到对应的Cell
//将数据写入文件并保存在指定文件夹
OutputStream outputStream = context.getContentResolver().openOutputStream(Uri uri);
XSSFWorkbook.write(outputStream);
java
//读取Excel并将其写入数据库
public List<Map<Integer, Object>> readExcel(Context context, Uri fileUri, String strFileUri) {
mySQLHelp = new MySQLHelp(context, "mydb.db", null, 1);
SQLiteDatabase writableDatabase = mySQLHelp.getWritableDatabase();
excelStr = strFileUri.substring(strFileUri.lastIndexOf("."));
try {
inputStream = context.getContentResolver().openInputStream(fileUri);
if (excelStr.equals(".xlsx")) workbook = new XSSFWorkbook(inputStream);
else if (excelStr.equals(".xls")) workbook = new HSSFWorkbook(inputStream);
else workbook = null;
if (workbook != null) {
Sheet sheetAt = workbook.getSheetAt(0);
Row row = sheetAt.getRow(0);
int physicalNumberOfCells = row.getPhysicalNumberOfCells();//获取实际单元格数
Map<Integer, Object> map = new HashMap<>();
for (int i = 0; i < physicalNumberOfCells; i++) {//将标题存储到map
Object cellFormatValue = getCellFormatValue(row.getCell(i));
map.put(i, cellFormatValue);
}
dataList.add(map);
int physicalNumberOfRows = sheetAt.getPhysicalNumberOfRows();//获取最大行数
int size = map.size();//获取最大列数
contentValues = new ContentValues();
for (int i = 1; i < physicalNumberOfRows; i++) {
Map<Integer, Object> map1 = new HashMap<>();
Row row1 = sheetAt.getRow(i);
if (!row1.equals(null)) {
for (int j = 0; j < size; j++) {
Object cellFormatValue = getCellFormatValue(row1.getCell(j));
map1.put(j, cellFormatValue);
System.out.println(j);
}
contentValues.put("materialID", (String) map1.get(0));
contentValues.put("materialEncoding", (String) map1.get(1));
contentValues.put("materialName", (String) map1.get(2));
contentValues.put("materialModel", (String) map1.get(3));
contentValues.put("materialSize", (String) map1.get(4));
contentValues.put("unit", (String) map1.get(5));
contentValues.put("price", (String) map1.get(6));
contentValues.put("count", (String) map1.get(7));
contentValues.put("manufacturers", (String) map1.get(8));
contentValues.put("type", (String) map1.get(9));
contentValues.put("receiptor", (String) map1.get(10));
contentValues.put("storagelocation", (String) map1.get(11));
contentValues.put("materialState", (String) map1.get(12));
writableDatabase.insert("module", null, contentValues);
} else break;
dataList.add(map1);
}
contentValues.clear();
writableDatabase.close();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return dataList;
}
private static Object getCellFormatValue(Cell cell) {
Object cellValue;
if (cell != null) {
switch (cell.getCellType()) {
case Cell.CELL_TYPE_BOOLEAN:
cellValue = cell.getBooleanCellValue();
break;
case Cell.CELL_TYPE_NUMERIC:
cellValue = String.valueOf(cell.getNumericCellValue());
break;
case Cell.CELL_TYPE_FORMULA:
if (DateUtil.isCellDateFormatted(cell)) {
cellValue = cell.getDateCellValue();
} else {
cellValue = cell.getNumericCellValue();
}
break;
case Cell.CELL_TYPE_STRING:
cellValue = cell.getStringCellValue();
break;
default:
cellValue = "";
}
} else {
cellValue = "";
}
return cellValue;
}
java
//读取数据库数据将其写入Excel并保存到指定路径文件夹
public void getDataAndSave(Context context,Uri uri) {
ArrayList<Map<Integer,Object>> arrayList = new ArrayList<>();
Map<Integer,Object> m = new HashMap<>();
m.put(0,"物料ID");
m.put(1,"物料编码");
m.put(2,"名称");
m.put(3,"编号");
m.put(4,"规格");
m.put(5,"单位");
m.put(6,"单价");
m.put(7,"数量");
m.put(8,"厂家");
m.put(9,"类别");
m.put(10,"经手人");
m.put(11,"存放地点");
m.put(12,"状态");
arrayList.add(m);
mySQLHelp = new MySQLHelp(context, "mydb.db", null, 1);
SQLiteDatabase readableDatabase = mySQLHelp.getReadableDatabase();
cursor = readableDatabase.rawQuery("select * from module", null);
while (cursor.moveToNext()) {
Map<Integer,Object> map = new HashMap<>();
String materialID = cursor.getString(cursor.getColumnIndex("materialID"));
String materialEncoding = cursor.getString(cursor.getColumnIndex("materialEncoding"));
String materialName = cursor.getString(cursor.getColumnIndex("materialName"));
String materialModel = cursor.getString(cursor.getColumnIndex("materialModel"));
String materialSize = cursor.getString(cursor.getColumnIndex("materialSize"));
String unit = cursor.getString(cursor.getColumnIndex("unit"));
String price = cursor.getString(cursor.getColumnIndex("price"));
String count = cursor.getString(cursor.getColumnIndex("count"));
String manufacturers = cursor.getString(cursor.getColumnIndex("manufacturers"));
String type = cursor.getString(cursor.getColumnIndex("type"));
String receiptor = cursor.getString(cursor.getColumnIndex("receiptor"));
String storagelocation = cursor.getString(cursor.getColumnIndex("storagelocation"));
String materialState = cursor.getString(cursor.getColumnIndex("materialState"));
map.put(0,materialID);
map.put(1,materialEncoding);
map.put(2,materialName);
map.put(3,materialModel);
map.put(4,materialSize);
map.put(5,unit);
map.put(6,price);
map.put(7,count);
map.put(8,manufacturers);
map.put(9,type);
map.put(10,receiptor);
map.put(11,storagelocation);
map.put(12,materialState);
arrayList.add(map);
}
try {
XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet sheet = workbook.createSheet(WorkbookUtil.createSafeSheetName("Sheet1"));
Cell cell;
int size = arrayList.get(0).size();
for (int i = 0;i < arrayList.size();i++){
Row row = sheet.createRow(i);
Map<Integer, Object> map = arrayList.get(i);
for (int j = 0;j < size;j++){
cell = row.createCell(j);
cell.setCellValue((String) map.get(j));
}
}
OutputStream outputStream = context.getContentResolver().openOutputStream(uri);
workbook.write(outputStream);
outputStream.flush();
outputStream.close();
Toast.makeText(context, "另存成功", Toast.LENGTH_SHORT).show();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
👉其他
📢作者:小空和小芝中的小空
📢转载说明-务必注明来源:https://zhima.blog.csdn.net/
📢这位道友请留步 ☁️,我观你气度不凡 ,谈吐间隐隐有王者霸气💚,日后定有一番大作为📝!!!旁边有点赞 👍收藏🌟今日传你,点了吧,未来你成功☀️,我分文不取,若不成功⚡️,也好回来找我。
温馨提示:点击下方卡片获取更多意想不到的资源。