desc:modify excel fun

main
xiaowusky 2 years ago
parent 2cb3e05baa
commit 04b2c5fd13

@ -1,7 +1,5 @@
package com.yinuo.safetywatcher;
import androidx.lifecycle.Observer;
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
@ -10,11 +8,6 @@ import android.media.projection.MediaProjectionManager;
import android.os.Build;
import android.os.Bundle;
import android.preference.PreferenceManager;
import androidx.annotation.Nullable;
import androidx.core.app.ActivityCompat;
import androidx.appcompat.app.AppCompatActivity;
import android.view.TextureView;
import android.view.View;
import android.widget.CheckBox;
@ -22,8 +15,13 @@ import android.widget.CompoundButton;
import android.widget.TextView;
import android.widget.Toast;
import com.yinuo.safetywatcher.utils.ExcelUtils;
import com.yinuo.safetywatcher.xls.Demo;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.lifecycle.Observer;
import com.yinuo.safetywatcher.xls.SimpleCellValue;
import com.yinuo.safetywatcher.xls.utils.ExcelUtils;
import org.easydarwin.push.MediaStream;
@ -182,6 +180,7 @@ public class MainActivity extends AppCompatActivity {
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case REQUEST_CAMERA_PERMISSION: {
if (grantResults.length > 1
@ -223,6 +222,7 @@ public class MainActivity extends AppCompatActivity {
@Override
protected void onActivityResult(int requestCode, final int resultCode, final Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_MEDIA_PROJECTION) {
getMediaStream().subscribe(new Consumer<MediaStream>() {
@Override
@ -251,21 +251,22 @@ public class MainActivity extends AppCompatActivity {
// intent.putExtra("videoPath", path);
// startActivity(intent);
List<List<Demo>> allData = new ArrayList<>();
List<Demo> row1 = new ArrayList<>();
row1.add(new Demo("5.22"));
row1.add(new Demo("1"));
row1.add(new Demo("2"));
row1.add(new Demo("3"));
List<Demo> row2 = new ArrayList<>();
row2.add(new Demo("5.23"));
row2.add(new Demo("4"));
row2.add(new Demo("5"));
List<List<SimpleCellValue>> allData = new ArrayList<>();
List<SimpleCellValue> row1 = new ArrayList<>();
row1.add(new SimpleCellValue("5.22"));
row1.add(new SimpleCellValue("1"));
row1.add(new SimpleCellValue("2"));
row1.add(new SimpleCellValue("3"));
List<SimpleCellValue> row2 = new ArrayList<>();
row2.add(new SimpleCellValue("5.23"));
row2.add(new SimpleCellValue("4"));
row2.add(new SimpleCellValue("5"));
row2.add(new SimpleCellValue("6"));
allData.add(row1);
allData.add(row2);
ExcelUtils.INSTANCE.writeStringListToExcelDemo(allData, this);
ExcelUtils.INSTANCE.writeStringListToExcel(allData, this);
}
public void OnSaveRecord(View view) {

@ -1,409 +0,0 @@
package com.yinuo.safetywatcher.utils
import android.content.Context
import android.text.TextUtils
import android.util.Log
import com.yinuo.safetywatcher.xls.Constants
import com.yinuo.safetywatcher.xls.Constants.COLUMN_NAME_MAP
import com.yinuo.safetywatcher.xls.Demo
import com.yinuo.safetywatcher.xls.ExcelLabelBean
import jxl.Workbook
import jxl.WorkbookSettings
import jxl.write.Label
import jxl.write.WritableCellFormat
import jxl.write.WritableFont
import jxl.write.WritableImage
import jxl.write.WritableWorkbook
import jxl.write.WriteException
import java.io.File
import java.io.FileInputStream
import java.io.InputStream
/**
* excel表格工具
*/
object ExcelUtils {
private const val TAG: String = "ExcelUtils"
private const val UTF8_ENCODING = "UTF-8"
private var arial12format: WritableCellFormat? = null
private var ImageSize: Int = 0
private val ImageSizeList = arrayListOf<Int>()
private fun initExcel(
allRowsData: List<List<ExcelLabelBean>>,
filePath: String,
sheetName: String
) {
format()
var workbook: WritableWorkbook? = null
try {
val file = File(filePath)
if (!file.exists()) {
file.createNewFile()
}
workbook = Workbook.createWorkbook(file)
val sheet = workbook.createSheet(sheetName, 0)
sheet.addCell(Label(0, 0, filePath, arial12format))
ImageSize = 0
ImageSizeList.clear()
for ((index, value) in allRowsData.withIndex()) {
ImageSizeList.add(
(allRowsData.get(index).get(8).excelLableContent.length - allRowsData.get(index)
.get(8).excelLableContent.replace("|", "").length) + 1
)
}
for (i in 0 until ImageSizeList.size) {
if (ImageSize < ImageSizeList.get(i)) {
ImageSize = ImageSizeList.get(i)
}
}
val columnNameMap = COLUMN_NAME_MAP
for (number in 0..ImageSize + 10) {
if (number <= 8) {
for ((index, value) in columnNameMap.withIndex()) {
if (index <= 8) {
sheet.addCell(Label(index, 0, value.excelName, arial12format))
}
}
} else if (number > 8 && number <= ImageSize + 7) {
sheet.addCell(Label(number, 0, "", arial12format))
} else if (number == ImageSize + 8) {
for ((index, value) in columnNameMap.withIndex()) {
if (index > 8) {
sheet.addCell(
Label(
index + ImageSize - 1,
0,
value.excelName,
arial12format
)
)
}
}
}
}
workbook.write()
} catch (e: Exception) {
Log.e(TAG, "initExcel e==" + e.message)
} finally {
try {
workbook?.close()
} catch (e: Exception) {
Log.e(TAG, "initExcel e==" + e.message)
}
}
}
private fun format() {
try {
val writableFont = WritableFont(WritableFont.ARIAL, 12)
arial12format = WritableCellFormat(writableFont)
arial12format?.setBorder(jxl.format.Border.ALL, jxl.format.BorderLineStyle.THIN)
} catch (exception: WriteException) {
Log.e(TAG, "format() e==" + exception.message)
}
}
// fun importSheet(context: Context): ArrayList<CheckListTemplateBean> {
// val inputStream: InputStream =
// context.resources.assets.open(Constants.ASSETS_PRESET_EXCEL_NAME)
// val book: Workbook = Workbook.getWorkbook(inputStream)
// try {
//
// val sheet = book.getSheet(0)
// val checkListTemplateBeans = ArrayList<CheckListTemplateBean>()
// for (i in 1 until sheet.rows) {
// val checkListTopic = CheckListTopic()
// //导入的Excel中第1列要是。检查主题 这一项
// checkListTopic.topicName = sheet.getCell(0, i).contents
//
// val checkObj = CheckObjType()
// //导入的Excel中第2列要是检查对象 这一项
// checkObj.checkObj = sheet.getCell(1, i).contents
//
// val checkListTemplate = CheckListTemplate()
// //导入的Excel中第3列要是检查项目 这一项
// checkListTemplate.inspectionItems = sheet.getCell(2, i).contents
//
// val checkContent = CheckContent()
// //导入的Excel中第4列要是检查内容 这一项
// checkContent.inspectionContent = sheet.getCell(3, i).contents
// //导入的Excel中第5列要是检查标准 这一项
// checkContent.inspectionRule = sheet.getCell(4, i).contents
// //导入的Excel中第6列要是检查方法 这一项
// checkContent.inspectionFun = sheet.getCell(5, i).contents
// //导入的Excel中第7列要是检查依据 这一项
// checkContent.inspectionBasis = sheet.getCell(6, i).contents
//
// val checkListTemplateBean =
// CheckListTemplateBean(checkListTopic, checkObj, checkListTemplate, checkContent)
// checkListTemplateBeans.add(checkListTemplateBean)
// }
// book.close();
// return checkListTemplateBeans
// } catch (e: Exception) {
// Log.i(TAG, "importSheet e=" + e.message)
// } finally {
// book.close()
// inputStream.close()
// }
// return ArrayList()
// }
/**
* 获取一个对象的所有属性和值包括其二级对象的属性和值
*/
private fun readAllAttrs(any: Any): HashMap<String, Any> {
val hashMap: HashMap<String, Any> = HashMap()
try {
val javaClass = any.javaClass
val declaredFields = javaClass.declaredFields
for ((i, field) in declaredFields.iterator().withIndex()) {
field.isAccessible = true
val name = field.name
val valueAny = field[any]
hashMap[name] = valueAny
//获取子对象的属性和值
if (valueAny != null) {
val valueClass = valueAny.javaClass
val valueClassFields = valueClass.declaredFields
for (valueClassField in valueClassFields.iterator()) {
valueClassField.isAccessible = true
val valueClassFieldName = valueClassField.name
val valueClassFieldValue = valueClassField[valueAny]
hashMap[valueClassFieldName] = valueClassFieldValue
}
}
}
} catch (e: Exception) {
Log.e(TAG, "readAllAttrs() e==" + e.message)
}
return hashMap;
}
private fun makeDir(filePath: File) {
if (!filePath.parentFile.exists()) {
makeDir(filePath.parentFile)
}
filePath.mkdir()
}
private fun deleteByPath(filePath: String) {
val file = File(filePath)
if (file.exists()) {
if (file.isFile || file.isDirectory) {
file.delete()
}
}
}
private fun deleteExistFile(excelFilePath: String) {
val file = File(excelFilePath)
if (file.exists()) {
val files: Array<File> = file.listFiles()
for (i in files.indices) {
deleteByPath(files[i].absolutePath)
}
}
}
fun writeStringListToExcel(
allRowsData: List<List<ExcelLabelBean>>,
context: Context
): Boolean {
val fileName = PathUtils.getNowTimeFormat(PathUtils.DATE_TO_STRING_LONG_PATTERN) + ".xls"
Constants.EXCEL_EXPORT_NAME = fileName
val filePath =
PathUtils.getExternalStoragePath(context) + Constants.EXCEL_EXPORT_PATH + Constants.EXCEL_EXPORT_NAME
deleteExistFile(PathUtils.getExternalStoragePath(context) + Constants.EXCEL_EXPORT_PATH)
makeDir(File(PathUtils.getExternalStoragePath(context) + "/" + Constants.SAVE_EXPORT_EXCEL_PATH))
initExcel(allRowsData, filePath, Constants.SHEET_NAME) //需要写入权限
if (PathUtils.isListEmpty(allRowsData) || context == null)
return false
var writebook: WritableWorkbook? = null
var inputStream: InputStream? = null
try {
val setEncode = WorkbookSettings()
setEncode.encoding = UTF8_ENCODING
inputStream = FileInputStream(File(filePath))
val workbook = Workbook.getWorkbook(inputStream)
val file = File(filePath)
writebook = Workbook.createWorkbook(file, workbook)
val sheet = writebook.getSheet(0)
// for (number in 0..ImageSize+10) {
for ((row, item) in allRowsData.withIndex()) {
for ((colum, value) in item.withIndex()) {
if (value.isImage && !TextUtils.isEmpty(value.excelLableContent)) {
//这里value.excelLableContent 是图片在手机上的绝对地址,多个图片用|隔开
if (colum == 8) {
val split = value.excelLableContent.split("|")
var tempColum = colum
for (imagePath in split) {
val imgFile = File(imagePath)
if (imgFile.exists()) {
val image = WritableImage(
tempColum.toDouble(),
(row + 1).toDouble(),
1.0,
1.0,
imgFile
)
//设置行高
sheet.setRowView(row + 1, 1700, false)
sheet.addImage(image)
tempColum++
}
}
} else if (colum == 11) {
val split = value.excelLableContent.split("|")
var tempColum = colum + ImageSize - 1
for (imagePath in split) {
val imgFile = File(imagePath)
if (imgFile.exists()) {
val image = WritableImage(
tempColum.toDouble(),
(row + 1).toDouble(),
1.0,
1.0,
imgFile
)
//设置行高
sheet.setRowView(row + 1, 1700, false)
sheet.addImage(image)
tempColum++
}
}
}
} else if (colum <= 8) {
sheet.addCell(Label(colum, row + 1, value.excelLableContent, arial12format))
} else if (colum > 8) {
sheet.addCell(
Label(
colum + ImageSize - 1,
row + 1,
value.excelLableContent,
arial12format
)
)
}
// }
}
}
writebook.write()
Log.i(TAG, "Excelel 写入成功")
return true
} catch (e: Exception) {
Log.e(TAG, "writeStringListToExcel() e==" + e.message)
} finally {
writebook?.close()
inputStream?.close()
}
return false
}
// fun transformExportData(records: MutableList<CheckListDetailItemBean>): MutableList<List<ExcelLabelBean>> {
// val allRowsData: MutableList<List<ExcelLabelBean>> = java.util.ArrayList()
//
// for (checkListDetailItemBean in records) {
// val rowData: MutableList<ExcelLabelBean> = ArrayList()
// val allAttrs = readAllAttrs(checkListDetailItemBean)
// for ((i, item) in COLUMN_NAME_MAP.withIndex()) {
// val obj = allAttrs[item.sqTabName]
// rowData.add(ExcelLabelBean(obj as String, item.isImage))
// }
// allRowsData.add(rowData)
// }
//
// return allRowsData
// }
private fun initExcelDemo(
allColumNames: List<String>,
filePath: String,
sheetName: String
) {
format()
var workbook: WritableWorkbook? = null
try {
val file = File(filePath)
if (!file.exists()) {
file.createNewFile()
}
workbook = Workbook.createWorkbook(file)
val sheet = workbook.createSheet(sheetName, 0)
allColumNames.forEachIndexed { index, s ->
sheet.addCell(Label(index, 0, s, arial12format))
}
workbook.write()
} catch (e: Exception) {
Log.e(TAG, "initExcel e==" + e.message)
} finally {
try {
workbook?.close()
} catch (e: Exception) {
Log.e(TAG, "initExcel e==" + e.message)
}
}
}
fun writeStringListToExcelDemo(
allRowsData: List<List<Demo>>,
context: Context
): Boolean {
val fileName = PathUtils.getNowTimeFormat(PathUtils.DATE_TO_STRING_LONG_PATTERN) + ".xls"
Constants.EXCEL_EXPORT_NAME = fileName
val filePath =
PathUtils.getExternalStoragePath(context) + Constants.EXCEL_EXPORT_PATH + Constants.EXCEL_EXPORT_NAME
deleteExistFile(PathUtils.getExternalStoragePath(context) + Constants.EXCEL_EXPORT_PATH)
makeDir(File(PathUtils.getExternalStoragePath(context) + "/" + Constants.SAVE_EXPORT_EXCEL_PATH))
val columNames = mutableListOf<String>()
columNames.add("时间")
columNames.add("columNames1")
columNames.add("columNames2")
columNames.add("columNames3")
initExcelDemo(columNames, filePath, Constants.SHEET_NAME) //需要写入权限
if (PathUtils.isListEmpty(allRowsData) || context == null)
return false
var writebook: WritableWorkbook? = null
var inputStream: InputStream? = null
try {
val setEncode = WorkbookSettings()
setEncode.encoding = UTF8_ENCODING
inputStream = FileInputStream(File(filePath))
val workbook = Workbook.getWorkbook(inputStream)
val file = File(filePath)
writebook = Workbook.createWorkbook(file, workbook)
val sheet = writebook.getSheet(0)
for ((row, item) in allRowsData.withIndex()) {
item.forEachIndexed { index, demo ->
sheet.addCell(Label(index, row + 1, demo.content, arial12format))
}
}
writebook.write()
Log.i(TAG, "Excelel 写入成功")
return true
} catch (e: Exception) {
Log.e(TAG, "writeStringListToExcel() e==" + e.message)
} finally {
writebook?.close()
inputStream?.close()
}
return false
}
}

@ -1,6 +0,0 @@
package com.yinuo.safetywatcher.xls
/**
* excel到sql或者sql到excel列对象转化用
*/
data class ColumnObject(val excelName :String, val sqTabName: String,val isImage:Boolean)

@ -1,52 +0,0 @@
package com.yinuo.safetywatcher.xls
object Constants {
const val SAVE_EXPORT_EXCEL_PATH = "/WaterTransport/ExportExcel"
const val SAVE_PHOTO_PATH = "/WaterTransport/photo"
const val SAVE_AUDIO_PATH = "/WaterTransport/audio"
const val SHEET_NAME = "表格1"
const val ASSETS_PRESET_EXCEL_NAME = "preset.xls"
const val EXCEL_EXPORT_PATH = "/WaterTransport/ExportExcel/"
lateinit var EXCEL_EXPORT_NAME: String
//有序的 导出的excel按照这个顺序展示数据
val COLUMN_NAME_MAP = arrayListOf(
ColumnObject("检查主题", "topicName", false),
ColumnObject("检查对象类型", "checkObj", false),
ColumnObject("检查对象", "checkerObj", false),
ColumnObject("检查人", "checker", false),
ColumnObject("检查项目", "inspectionItems", false),
ColumnObject("检查内容", "inspectionContent", false),
// ColumnObject("检查标准", "inspectionRule", false),
// ColumnObject("检查方法", "inspectionFun", false),
// ColumnObject("检查依据", "inspectionBasis", false),
ColumnObject("检查结论", "checkResult", false),
ColumnObject("检查结果备注", "checkResultRemark", false),
ColumnObject("图片", "imgPath", true),
ColumnObject("好的做法", "checkResultGood", false),
ColumnObject("好的做法备注", "checkResultRemarkGood", false),
ColumnObject("好的做法图片", "imgPathGood", true),
)
const val BUNDLE_KEY_TOPIC_ID = "topic_id";
const val BUNDLE_KEY_CHECK_OBJ_DATA = "check_obj_data";
const val BUNDLE_KEY_TITLE = "title";
const val BUNDLE_KEY_DETAIL_CONTENT = "detail_content";
const val SP_NAME = "sp"
/**
* 默认图片展示单行数量
*/
const val DEFAULT_MEDIA_SIZE = 3
/**
* 默认图片展示间距
*/
const val DEFAULT_MEDIA_OFFSET = 30
const val FILE_PROVIDER_AUTHORITY = ".provider"
const val DEFAULT_VP_OFFSET = 100
}

@ -1,3 +0,0 @@
package com.yinuo.safetywatcher.xls
data class Demo(val content:String)

@ -1,3 +0,0 @@
package com.yinuo.safetywatcher.xls
data class ExcelLabelBean(val excelLableContent:String, val isImage:Boolean)

@ -0,0 +1,5 @@
package com.yinuo.safetywatcher.xls
interface ICellValue {
fun getValue(): String
}

@ -0,0 +1,7 @@
package com.yinuo.safetywatcher.xls
data class SimpleCellValue(val content: String) : ICellValue {
override fun getValue(): String {
return content
}
}

@ -0,0 +1,138 @@
package com.yinuo.safetywatcher.xls.utils
import android.content.Context
import android.util.Log
import com.yinuo.safetywatcher.xls.ICellValue
import com.yinuo.safetywatcher.R
import jxl.Workbook
import jxl.WorkbookSettings
import jxl.write.Label
import jxl.write.WritableCellFormat
import jxl.write.WritableFont
import jxl.write.WritableWorkbook
import jxl.write.WriteException
import java.io.File
import java.io.FileInputStream
import java.io.InputStream
/**
* excel表格工具
*/
object ExcelUtils {
private const val TAG: String = "ExcelUtils"
private const val UTF8_ENCODING = "UTF-8"
private var arial12format: WritableCellFormat? = null
private fun format() {
try {
val writableFont = WritableFont(WritableFont.ARIAL, 12)
arial12format = WritableCellFormat(writableFont)
arial12format?.setBorder(jxl.format.Border.ALL, jxl.format.BorderLineStyle.THIN)
} catch (exception: WriteException) {
Log.e(TAG, "format() e==" + exception.message)
}
}
private fun makeDir(filePath: File) {
if (!filePath.parentFile.exists()) {
makeDir(filePath.parentFile)
}
filePath.mkdir()
}
private fun deleteByPath(filePath: String) {
val file = File(filePath)
if (file.exists()) {
if (file.isFile || file.isDirectory) {
file.delete()
}
}
}
private fun deleteExistFile(excelFilePath: String) {
val file = File(excelFilePath)
if (file.exists()) {
val files: Array<File> = file.listFiles()
for (i in files.indices) {
deleteByPath(files[i].absolutePath)
}
}
}
private fun initExcel(
allColumNames: Array<String>,
filePath: String,
sheetName: String
) {
format()
var workbook: WritableWorkbook? = null
try {
val file = File(filePath)
if (!file.exists()) {
file.createNewFile()
}
workbook = Workbook.createWorkbook(file)
val sheet = workbook.createSheet(sheetName, 0)
allColumNames.forEachIndexed { index, s ->
sheet.addCell(Label(index, 0, s, arial12format))
}
workbook.write()
} catch (e: Exception) {
Log.e(TAG, "initExcel e==" + e.message)
} finally {
try {
workbook?.close()
} catch (e: Exception) {
Log.e(TAG, "initExcel e==" + e.message)
}
}
}
fun writeStringListToExcel(
allRowsData: List<List<ICellValue>>,
context: Context
): Boolean {
val fileName = PathUtils.getNowTimeFormat(PathUtils.DATE_TO_STRING_LONG_PATTERN) + ".xls"
PathUtils.EXCEL_EXPORT_NAME = fileName
val filePath =
PathUtils.getExternalStoragePath(context) + PathUtils.EXCEL_EXPORT_PATH + PathUtils.EXCEL_EXPORT_NAME
deleteExistFile(PathUtils.getExternalStoragePath(context) + PathUtils.EXCEL_EXPORT_PATH)
makeDir(File(PathUtils.getExternalStoragePath(context) + PathUtils.EXCEL_EXPORT_PATH))
val columns = context.resources.getStringArray(R.array.excel_column);
initExcel(columns, filePath, PathUtils.SHEET_NAME) //需要写入权限
if (PathUtils.isListEmpty(allRowsData) || context == null)
return false
var writebook: WritableWorkbook? = null
var inputStream: InputStream? = null
try {
val setEncode = WorkbookSettings()
setEncode.encoding = UTF8_ENCODING
inputStream = FileInputStream(File(filePath))
val workbook = Workbook.getWorkbook(inputStream)
val file = File(filePath)
writebook = Workbook.createWorkbook(file, workbook)
val sheet = writebook.getSheet(0)
for ((row, item) in allRowsData.withIndex()) {
item.forEachIndexed { index, cellValue ->
sheet.addCell(Label(index, row + 1, cellValue.getValue(), arial12format))
}
}
writebook.write()
Log.i(TAG, "Excelel 写入成功")
return true
} catch (e: Exception) {
Log.e(TAG, "writeStringListToExcel() e==" + e.message)
} finally {
writebook?.close()
inputStream?.close()
}
return false
}
}

@ -1,4 +1,4 @@
package com.yinuo.safetywatcher.utils
package com.yinuo.safetywatcher.xls.utils
import android.content.Context
import android.os.Environment
@ -11,6 +11,9 @@ import java.util.Locale
*/
object PathUtils {
private const val TAG: String = "BaseUtils"
const val SHEET_NAME = "表格1"
const val EXCEL_EXPORT_PATH = "/ExportExcel/"
lateinit var EXCEL_EXPORT_NAME: String
const val DATE_TO_STRING_LONG_PATTERN: String = "yyyy_MM_dd_HH_mm_ss"
fun <T> isListEmpty(list: List<T>?): Boolean {
@ -31,7 +34,7 @@ object PathUtils {
/**
* 外部存储目录
*/
fun getExternalStorageDirectory(): String?{
fun getExternalStorageDirectory(): String? {
return Environment.getExternalStorageDirectory().absolutePath
}

@ -1,3 +1,11 @@
<resources>
<string name="app_name">My Application</string>
<string-array name="excel_column">
<item>时间</item>
<item>属性</item>
<item></item>
<item>单位</item>
</string-array>
</resources>

Loading…
Cancel
Save