package com.project.survey.util; import android.content.Context; import android.text.TextUtils; import android.util.Log; import android.view.View; import androidx.annotation.MainThread; import androidx.annotation.WorkerThread; import com.bingce.data.cache.CachedProject; import com.bingce.file.FileOperator; import com.bingce.surveyor.util.dialog.CustomDialog; import com.bingce.surveyor.util.dialog.CustomInputDialog; import com.bingce.utils.FileUtil; import com.bingce.utils.ThreadPoolUtil; import com.bingce.utils.Util; import com.hjq.permissions.Permission; import com.hjq.permissions.XXPermissions; import com.project.survey.App; import com.project.survey.BuildConfig; import com.project.survey.R; import com.project.survey.dialog.CustomStyleDialog; import com.project.survey.ui.instrument.setupstation.AddResultFormatActivity; import com.project.survey.ui.instrument.setupstation.db.PointSurveyRecord; import com.project.survey.ui.instrument.setupstation.db.resultformat.FormatRecord; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import blankj.utilcode.util.ToastUtils; import blankj.utilcode.util.Utils; import jxl.Workbook; import jxl.format.Colour; import jxl.write.Label; import jxl.write.WritableCell; import jxl.write.WritableCellFormat; import jxl.write.WritableFont; import jxl.write.WritableSheet; import jxl.write.WritableWorkbook; import jxl.write.WriteException; import jxl.WorkbookSettings; public class ExcelUtil { public static final int ID_POINT_STAKING = 0; public static final int ID_POINT_COORDINATE = ID_POINT_STAKING + 1; public static final int ID_CONVER_PARAMETER = ID_POINT_COORDINATE + 1; public static final int ID_RESULT_EXPORT_PLANE_POINT_COORDINATE = ID_CONVER_PARAMETER + 1; public static final int ID_RESULT_EXPORT_LATLON_POINT_COORDINATE = ID_RESULT_EXPORT_PLANE_POINT_COORDINATE + 1; public static final int ID_CUSTOM_EXPORT = ID_RESULT_EXPORT_LATLON_POINT_COORDINATE + 1; public static final int ID_LINE_STAKING = ID_CUSTOM_EXPORT + 1; public static final int ID_MIDDLE_SIDE_STAKING = ID_LINE_STAKING + 1; public static final int ID_STAKING_TO_LINE = ID_MIDDLE_SIDE_STAKING + 1; public static final int ID_STAKING_SIDE_COMMON = ID_STAKING_TO_LINE + 1; public static final int ID_CAD_STAKING = ID_STAKING_SIDE_COMMON + 1; private static WritableFont arial14font = null; private static WritableCellFormat arial14format = null; private static WritableFont arial10font = null; private static WritableCellFormat arial10format = null; private static WritableFont arial12font = null; private static WritableCellFormat arial12format = null; private final static String UTF8_ENCODING = "UTF-8"; private final static List topTabsPointCoordinate = Arrays.asList( Utils.getApp().getString(R.string.point_name), Utils.getApp().getString(R.string.point_code), Utils.getApp().getString(R.string.latitude), Utils.getApp().getString(R.string.longitude), Utils.getApp().getString(R.string.altitude), Utils.getApp().getString(R.string.antenna_type), Utils.getApp().getString(R.string.antenna_height), Utils.getApp().getString(R.string.easting), Utils.getApp().getString(R.string.northing), Utils.getApp().getString(R.string.elevation), Utils.getApp().getString(R.string.solution_state), Utils.getApp().getString(R.string.satellite_num), Utils.getApp().getString(R.string.satellite_track_num), Utils.getApp().getString(R.string.pdop), Utils.getApp().getString(R.string.hrms), Utils.getApp().getString(R.string.vrms), Utils.getApp().getString(R.string.diff_delay), Utils.getApp().getString(R.string.remark), Utils.getApp().getString(R.string.acquisition_time), Utils.getApp().getString(R.string.base_station) + "ID", Utils.getApp().getString(R.string.base_station) + Utils.getApp().getString(R.string.latitude), Utils.getApp().getString(R.string.base_station) + Utils.getApp().getString(R.string.longitude), Utils.getApp().getString(R.string.base_station) + Utils.getApp().getString(R.string.distance), Utils.getApp().getString(R.string.tilt_survey)); private final static List topTabsResultExportPLANE = Arrays.asList( Utils.getApp().getString(R.string.point_name), Utils.getApp().getString(R.string.point_code), Utils.getApp().getString(R.string.easting), Utils.getApp().getString(R.string.northing), Utils.getApp().getString(R.string.elevation)); private final static List topTabsResultExportLatLon = Arrays.asList( Utils.getApp().getString(R.string.point_name), Utils.getApp().getString(R.string.point_code), Utils.getApp().getString(R.string.latitude), Utils.getApp().getString(R.string.longitude), Utils.getApp().getString(R.string.altitude)); public static List topTabCustomExport = Arrays.asList(); /** * 单元格的格式设置 字体大小 颜色 对齐方式、背景颜色等... */ private static void format() { try { arial14font = new WritableFont(WritableFont.ARIAL, 14, WritableFont.BOLD); arial14font.setColour(Colour.LIGHT_BLUE); arial14format = new WritableCellFormat(arial14font); arial14format.setAlignment(jxl.format.Alignment.CENTRE); arial14format.setBorder(jxl.format.Border.ALL, jxl.format.BorderLineStyle.THIN); arial14format.setBackground(Colour.VERY_LIGHT_YELLOW); arial10font = new WritableFont(WritableFont.ARIAL, 10, WritableFont.BOLD); arial10format = new WritableCellFormat(arial10font); arial10format.setAlignment(jxl.format.Alignment.CENTRE); arial10format.setBorder(jxl.format.Border.ALL, jxl.format.BorderLineStyle.THIN); arial10format.setBackground(Colour.GRAY_25); arial12font = new WritableFont(WritableFont.ARIAL, 10); arial12format = new WritableCellFormat(arial12font); //对齐格式 arial10format.setAlignment(jxl.format.Alignment.CENTRE); //设置边框 arial12format.setBorder(jxl.format.Border.ALL, jxl.format.BorderLineStyle.THIN); } catch (WriteException e) { e.printStackTrace(); } } /** * 导出Excel文件调用此方法 */ public static void exportFormat(int ID_TYPE, Context context, CachedProject currentProject, IExportExcel exportExcel) { exportFormat(ID_TYPE, context, currentProject, null, exportExcel); } public static void exportFormat(int ID_TYPE, Context context, CachedProject currentProject, FormatRecord formatRecord, IExportExcel exportExcel) { if (XXPermissions.isGranted(context, Permission.MANAGE_EXTERNAL_STORAGE)) { showEditTextDialog(ID_TYPE, context, currentProject, formatRecord, exportExcel); } else { ToastUtils.showShort(context.getString(R.string.open_read_write_permissions)); } } private static CustomInputDialog.Builder inputBuilder; private static void showEditTextDialog(int ID_TYPE, Context context, CachedProject currentProject, FormatRecord formatRecord, IExportExcel exportExcel) { inputBuilder = new CustomInputDialog.Builder(context); inputBuilder.setTitle(context.getString(R.string.export_excel_file_name)).setInputHint(context.getString(R.string.file_name)).setButtonConfirm(new CustomInputDialog.setOnConfirmClickListener() { @Override public void OnConfirmClick(String editText) { if (TextUtils.isEmpty(editText.trim())) { ToastUtils.showShort(context.getString(R.string.enter_file_name)); return; } setExcelInformation(ID_TYPE, editText.trim(), context, currentProject, formatRecord, exportExcel); } }).create().show(); } public interface IExportExcel { void onExportExcel(String filePaths); } /** * 设置excel保存的path、名称 */ private static String sheetName, filePaths; private static void setExcelInformation(int ID_TYPE, String inputFileName, Context context, CachedProject currentProject, FormatRecord formatRecord, IExportExcel exportExcel) { filePaths = FileUtil.getSDPath() + "/" + context.getString(R.string.surveyor_exported_file) + "/" + context.getString(R.string.point_survey) + "/" + inputFileName + ".xls"; switch (ID_TYPE) { case ID_POINT_COORDINATE: sheetName = context.getString(R.string.coordinate_points_library) + " " + SystemUtils.getSimpleDateFormat(); break; case ID_RESULT_EXPORT_PLANE_POINT_COORDINATE://(E,N,h).xls filePaths = FileUtil.getSDPath() + "/" + context.getString(R.string.surveyor_exported_file) + "/" + context.getString(R.string.point_survey) + "/" + inputFileName + "(E,N,h).xls"; sheetName = context.getString(R.string.results_the_export) + " " + SystemUtils.getSimpleDateFormat(); break; case ID_RESULT_EXPORT_LATLON_POINT_COORDINATE://(B,L,H).xls filePaths = FileUtil.getSDPath() + "/" + context.getString(R.string.surveyor_exported_file) + "/" + context.getString(R.string.point_survey) + "/" + inputFileName + "(B,L,H).xls"; sheetName = context.getString(R.string.results_the_export) + " " + SystemUtils.getSimpleDateFormat(); break; case ID_CUSTOM_EXPORT://自定义格式 sheetName = context.getString(R.string.results_the_export) + " " + SystemUtils.getSimpleDateFormat(); break; } if (isCheckExistFile(filePaths)) { new CustomDialog.Builder(context).setContent("\"" + FileUtil.getSDPath() + "/" + context.getString(R.string.surveyor_exported_file) + "/" + context.getString(R.string.point_survey) + "/" + "\"" + context.getString(R.string.folder_name_already_exists) + "[" + inputFileName + ".xls]" + context.getString(R.string.replace_file)).setButtonConfirm(context.getString(R.string.replace), new View.OnClickListener() { @Override public void onClick(View v) { ThreadPoolUtil.execute(() -> { ExcelUtil.initExcel(filePaths, sheetName, ID_TYPE, formatRecord); exportExcel.onExportExcel(filePaths); }); } }).setButtonCancel(context.getString(R.string.rename), new View.OnClickListener() { @Override public void onClick(View v) { inputBuilder.create().show(); } }).create().show(); } else { ThreadPoolUtil.execute(() -> { ExcelUtil.initExcel(filePaths, sheetName, ID_TYPE, formatRecord); exportExcel.onExportExcel(filePaths); }); } } /** * 判断导出文件是否重复 * * @param filePaths 文件路径 */ private static boolean isCheckExistFile(String filePaths) { File file = new File(filePaths); return file.exists(); } /** * 初始化Excel表格 * * @param filePath 存放excel文件的路径(path/demo.xls) * @param sheetName Excel表格的表名 * @param colName excel中包含的列名(可以有多个) */ private static List colName; private static void initExcel(String filePath, String sheetName, int ID_TYPE, FormatRecord formatRecord) { switch (ID_TYPE) { case ID_POINT_COORDINATE: //用于判断是否导出的数据是否显示表格头 if (formatRecord != null) { List topCustomTabsPointCoordinate = new ArrayList<>(); String[] split = formatRecord.format_content.split(formatRecord.divided_symbols); for (int i = 0; i < split.length; i++) { topCustomTabsPointCoordinate.add(split[i]); } colName = topCustomTabsPointCoordinate; } else { colName = topTabsPointCoordinate; } break; case ID_RESULT_EXPORT_PLANE_POINT_COORDINATE: colName = topTabsResultExportPLANE; break; case ID_RESULT_EXPORT_LATLON_POINT_COORDINATE: colName = topTabsResultExportLatLon; break; case ID_CUSTOM_EXPORT: colName = topTabCustomExport; break; } format(); WritableWorkbook workbook = null; try { File file = new File(filePath); if (file.getParentFile() != null && !file.getParentFile().exists()) { file.getParentFile().mkdirs(); file.createNewFile(); } workbook = Workbook.createWorkbook(file); //设置表格的名字 WritableSheet sheet = workbook.createSheet(sheetName, 0); if (formatRecord != null) { if (formatRecord.file_header) { //创建标题栏 sheet.addCell((WritableCell) new Label(0, 0, filePath, arial14format)); for (int col = 0; col < colName.size(); col++) { sheet.addCell(new Label(col, 0, colName.get(col), arial10format)); } //设置行高 sheet.setRowView(0, 340); } } else { //创建标题栏 sheet.addCell((WritableCell) new Label(0, 0, filePath, arial14format)); for (int col = 0; col < colName.size(); col++) { sheet.addCell(new Label(col, 0, colName.get(col), arial10format)); } //设置行高 sheet.setRowView(0, 340); } workbook.write(); } catch (Exception e) { e.printStackTrace(); } finally { if (workbook != null) { try { workbook.close(); } catch (Exception e) { e.printStackTrace(); } } } } /** * 导出坐标库(新版本) * * @param objList * @param fileName * @param context */ @WorkerThread public static void exportCoordinator(List objList, String fileName, Context context, FormatRecord formatRecord) { // CoordinateSystem coordinateSystem = CachedCurrentCoordinateSystem.currentCoordinateSystem(); writeListToExcelNew(objList, fileName, context, formatRecord, pointBaseRecord -> { List regexList = new ArrayList<>(); String[] split = formatRecord.format_content.split(formatRecord.divided_symbols); for (int i = 0; i < split.length; i++) { regexList.add(split[i]); } List list = new ArrayList<>(); for (int i = 0; i < regexList.size(); i++) { String s = regexList.get(i); if (s.equals("点名") || s.equals("Point name") || s.equals("№точ.")) { list.add(pointBaseRecord.pointName); } else if (s.equals("编码") || s.equals("Code") || s.equals("Код")) { list.add(pointBaseRecord.code); } else if (s.equals("纬度") || s.equals("Latitude") || s.equals("Широта")) { list.add(convertAngleFormat(formatRecord.angle_format, pointBaseRecord.latitude)); } else if (s.equals("经度") || s.equals("Longitude") || s.equals("Долгота")) { list.add(convertAngleFormat(formatRecord.angle_format, pointBaseRecord.longitude)); } else if (s.equals("大地高") || s.equals("Geodetic height") || s.equals("Высота")) { list.add(Util.formatDouble2StringDotAuto(pointBaseRecord.altitude)); } else if (s.equals("天线类型") || s.equals("Antenna type") || s.equals("Тип антенны")) { list.add(pointBaseRecord.antennaTypeName == null ? "" : pointBaseRecord.antennaTypeName); } else if (s.equals("天线高") || s.equals("Antenna height") || s.equals("Высота антенны")) { if (pointBaseRecord.antennaHeight == -1) { list.add(""); } else { list.add(Util.formatDouble2StringDotAuto(pointBaseRecord.antennaHeight)); } } else if (s.equals("北坐标") || s.equals("Northing") || s.equals("Северные координаты.")) { list.add(Util.formatDouble2String(pointBaseRecord.planeN, 6)); } else if (s.equals("东坐标") || s.equals("Easting") || s.equals("Восточные координаты.")) { list.add(Util.formatDouble2String(pointBaseRecord.planeE, 6)); } else if (s.equals("高程") || s.equals("Elevation") || s.equals("Восточные координаты.")) { list.add(Util.formatDouble2String(pointBaseRecord.planeH, 6)); } else if (s.equals("解状态") || s.equals("Solution state") || s.equals("Режим решения.")) { list.add(pointBaseRecord.solutionState); } else if (s.equals("解算卫星") || s.equals("Satellite number") || s.equals("Спутник для вычисления")) { if (pointBaseRecord.satelliteNum == -1) { list.add(""); } else { list.add(Util.formatDouble2StringDotAuto(pointBaseRecord.satelliteNum)); } } else if (s.equals("可见卫星") || s.equals("Satellite track num") || s.equals("Видимый спутник")) { if (pointBaseRecord.satelliteTrackNum == -1) { list.add(""); } else { list.add(Util.formatDouble2StringDotAuto(pointBaseRecord.satelliteTrackNum)); } } else if (s.equals(context.getString(R.string.pdop))) { if (pointBaseRecord.pdop == -1) { list.add(""); } else { list.add(Util.formatDouble2StringDotAuto(pointBaseRecord.pdop)); } } else if (s.equals(context.getString(R.string.hrms))) { if (pointBaseRecord.hrms == -1) { list.add(""); } else { list.add(Util.formatDouble2StringDotAuto(pointBaseRecord.hrms)); } } else if (s.equals(context.getString(R.string.vrms))) { if (pointBaseRecord.vrms == -1) { list.add(""); } else { list.add(Util.formatDouble2StringDotAuto(pointBaseRecord.vrms)); } } else if (s.equals("差分延迟") || s.equals("Diff age") || s.equals("Дифференциальная задержка")) { if (pointBaseRecord.diffAge == -1) { list.add(""); } else { list.add(Util.formatDouble2StringDotAuto(pointBaseRecord.diffAge)); } } else if (s.equals("备注") || s.equals("Remark") || s.equals("примечан")) { list.add(pointBaseRecord.remarks); } else if (s.equals("采集时间") || s.equals("Measure time") || s.equals("Время сбора")) { list.add(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(pointBaseRecord.createdAt)); } else if (s.equals("惯导测量") || s.equals("Tilt survey") || s.equals("Нормативное измерение")) { if (pointBaseRecord.isTiltEnable) { list.add(context.getString(R.string.yes)); } else { list.add(context.getString(R.string.no)); } } } return list; }); } /** * 根据成果导出的格式,经纬度进行转换导出 * * @param angle_format_type * @param l * @return */ private static String convertAngleFormat(int angle_format_type, double l) { if (angle_format_type == AddResultFormatActivity.ANGLE_FORMAT_D_MS) { //度.分秒 return Util.radianToDmsDoubleString(Math.toRadians(l), 6, false); } else if (angle_format_type == AddResultFormatActivity.ANGLE_FORMAT_D_M_S) { //度°分′秒″ return Util.radianToDmsString(Math.toRadians(l), 6, true); } else if (angle_format_type == AddResultFormatActivity.ANGLE_FORMAT_D) { //度 return Util.formatDouble2String(l, 6); } else { //弧度 return Util.formatDouble2String(Math.toRadians(l), 6); } } /** * 导出坐标库(老版本) * * @param objList * @param fileName * @param context */ @WorkerThread public static void exportCoordinator(List objList, String fileName, Context context) { // CoordinateSystem coordinateSystem = CachedCurrentCoordinateSystem.currentCoordinateSystem(); writeListToExcel(objList, fileName, context, pointBaseRecord -> { List list = new ArrayList<>(); list.add(pointBaseRecord.pointName); list.add(pointBaseRecord.code); list.add(Util.formatDouble2String(pointBaseRecord.latitude, 6)); list.add(Util.formatDouble2String(pointBaseRecord.longitude, 6)); list.add(Util.formatDouble2String(pointBaseRecord.altitude, 6)); list.add(pointBaseRecord.antennaTypeName == null ? "" : pointBaseRecord.antennaTypeName); list.add(Util.formatDouble2StringDotAuto(pointBaseRecord.antennaHeight)); list.add(Util.formatDouble2String(pointBaseRecord.planeE, 6)); list.add(Util.formatDouble2String(pointBaseRecord.planeN, 6)); list.add(Util.formatDouble2String(pointBaseRecord.planeH, 6)); list.add(pointBaseRecord.solutionState); list.add(Util.formatDouble2StringDotAuto(pointBaseRecord.satelliteNum)); list.add(Util.formatDouble2StringDotAuto(pointBaseRecord.satelliteTrackNum)); list.add(Util.formatDouble2StringDotAuto(pointBaseRecord.pdop)); list.add(Util.formatDouble2StringDotAuto(pointBaseRecord.hrms)); list.add(Util.formatDouble2StringDotAuto(pointBaseRecord.vrms)); list.add(Util.formatDouble2StringDotAuto(pointBaseRecord.diffAge)); list.add(pointBaseRecord.remarks); list.add(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(pointBaseRecord.createdAt)); list.add(pointBaseRecord.siteId == null ? "" : pointBaseRecord.siteId); String blhLat = Util.radianToDmsDoubleString(Math.toRadians(pointBaseRecord.siteLatitude), 4, true); String blhLon = Util.radianToDmsDoubleString(Math.toRadians(pointBaseRecord.siteLongitude), 4, true); Log.e("radianToDmsString", blhLat + "----" + blhLon); list.add(blhLat); list.add(blhLon); list.add(Util.formatDouble2StringDotAuto(pointBaseRecord.siteDistance2D)); if (pointBaseRecord.isTiltEnable) { list.add(context.getString(R.string.yes)); } else { list.add(context.getString(R.string.no)); } return list; }); } /** * 导出成果导出(平面坐标) * * @param objList * @param fileName * @param context */ public static void exportCoordinatePlane(List objList, String fileName, Context context) { ThreadPoolUtil.execute(() -> { writeListToExcel(objList, fileName, context, planePointBaseRecord -> { List list = new ArrayList<>(); list.add(planePointBaseRecord.pointName); list.add(planePointBaseRecord.code); list.add(Util.formatDouble2String(planePointBaseRecord.planeE, 6)); list.add(Util.formatDouble2String(planePointBaseRecord.planeN, 6)); list.add(Util.formatDouble2String(planePointBaseRecord.planeH, 6)); return list; }); }); } /** * 导出成果导出(经纬度坐标) * * @param objList * @param fileName * @param context */ public static void exportCoordinateLatlon(List objList, String fileName, Context context) { ThreadPoolUtil.execute(() -> { writeListToExcel(objList, fileName, context, latlonPointBaseRecord -> { List list = new ArrayList<>(); list.add(latlonPointBaseRecord.pointName); list.add(latlonPointBaseRecord.code); list.add(Util.formatDouble2String(latlonPointBaseRecord.latitude, 6)); list.add(Util.formatDouble2String(latlonPointBaseRecord.longitude, 6)); list.add(Util.formatDouble2String(latlonPointBaseRecord.altitude, 6)); return list; }); }); } private interface IRecord2StringList { List convert(T t); } private static File file; private static void writeListToExcel(List objList, String fileName, Context context, IRecord2StringList record2StringList) { if (objList != null && objList.size() > 0) { WritableWorkbook writebook = null; InputStream in = null; try { WorkbookSettings setEncode = new WorkbookSettings(); setEncode.setEncoding(UTF8_ENCODING); file = new File(fileName); in = new FileInputStream(file); Workbook workbook = Workbook.getWorkbook(in); writebook = Workbook.createWorkbook(file, workbook); WritableSheet sheet = writebook.getSheet(0); for (int j = 0; j < objList.size(); j++) { List list = record2StringList.convert(objList.get(j)); for (int i = 0; i < list.size(); i++) { sheet.addCell(new Label(i, j + 1, list.get(i), arial12format)); if (list.get(i) == null) { //设置列宽 sheet.setColumnView(i, 8); } else { if (list.get(i).length() <= 4) { //设置列宽 sheet.setColumnView(i, list.get(i).length() + 8); } else { //设置列宽 sheet.setColumnView(i, list.get(i).length() + 5); } } } //设置行高 sheet.setRowView(j + 1, 350); } writebook.write(); workbook.close(); } catch (Exception e) { e.printStackTrace(); ToastUtils.showShort(e.getMessage()); } finally { if (writebook != null) { try { writebook.close(); ThreadPoolUtil.executeInMain(new Runnable() { @Override public void run() { FileUtil.scanFile(context, file); showCompleteDialog(context, file); } }); } catch (Exception e) { e.printStackTrace(); ToastUtils.showShort(e.getMessage()); } } if (in != null) { try { in.close(); } catch (IOException e) { e.printStackTrace(); ToastUtils.showShort(e.getMessage()); } } } } } private static void writeListToExcelNew(List objList, String fileName, Context context, FormatRecord formatRecord, IRecord2StringList record2StringList) { if (objList != null && objList.size() > 0) { WritableWorkbook writebook = null; InputStream in = null; int x; try { WorkbookSettings setEncode = new WorkbookSettings(); setEncode.setEncoding(UTF8_ENCODING); file = new File(fileName); in = new FileInputStream(file); Workbook workbook = Workbook.getWorkbook(in); writebook = Workbook.createWorkbook(file, workbook); WritableSheet sheet = writebook.getSheet(0); for (int j = 0; j < objList.size(); j++) { List list = record2StringList.convert(objList.get(j)); //用于判断是否导出的数据是否显示表格头 x = j + 1;代表要表格头,x = j;代表不要表格头 if (formatRecord != null) { if (formatRecord.file_header) { x = j + 1; } else { x = j; } } else { x = j + 1; } for (int i = 0; i < list.size(); i++) { sheet.addCell(new Label(i, x, list.get(i), arial12format)); if (list.get(i) == null) { //设置列宽 sheet.setColumnView(i, 8); } else { if (list.get(i).length() <= 4) { //设置列宽 sheet.setColumnView(i, list.get(i).length() + 8); } else { //设置列宽 sheet.setColumnView(i, list.get(i).length() + 5); } } } //设置行高 sheet.setRowView(x, 350); } writebook.write(); workbook.close(); } catch (Exception e) { e.printStackTrace(); ToastUtils.showShort(e.getMessage()); } finally { if (writebook != null) { try { writebook.close(); ThreadPoolUtil.executeInMain(() -> { FileUtil.scanFile(context, file); showCompleteDialog(context, file); }); } catch (Exception e) { e.printStackTrace(); ToastUtils.showShort(e.getMessage()); } } if (in != null) { try { in.close(); } catch (IOException e) { e.printStackTrace(); ToastUtils.showShort(e.getMessage()); } } } } } @MainThread public static void showCompleteDialog(Context context, File file) { new CustomStyleDialog.Builder(context) .setTitle(context.getString(R.string.export_successful)) .setContent(file.getPath()) .setButtonSample(context.getString(R.string.close)) .setButtonCancel(context.getString(R.string.open), v -> FileUtil.openFile(context, file)) .setButtonConfirm(context.getString(R.string.send_to), v -> FileOperator.shareFile(context, file, BuildConfig.APPLICATION_ID)) .create() .show(); } }