美文网首页Java web
游戏数据读取写入:Java操作Excel与Json文件

游戏数据读取写入:Java操作Excel与Json文件

作者: 掌灬纹 | 来源:发表于2021-04-05 11:44 被阅读0次

    前言:近期弄了弄关卡类型的小游戏,发现游戏数据一般都是json格式存储的,json文件对于计算机读写来说确实比较简单方便,但大量的游戏数据对于人工录入来说确实麻烦,所以尝试依靠poi将数据操作转为对excel文件操作,请看~(下文不包括游戏具体实现,只有如何操作数据..)

    准备知识

    • 新建一个maven项目
    • 了解 poi 和 fastJson 基础理论

    实现效果

    游戏数据json格式 游戏数据excel格式

    1. pom文件

        <dependencies>
    
            <!--03 版本 -->
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi</artifactId>
                <version>4.1.2</version>
            </dependency>
    
            <!--07版本-->
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml</artifactId>
                <version>4.1.2</version>
            </dependency>
    
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.2.68</version>
            </dependency>
    
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.18.16</version>
            </dependency>
    
            <!--测试-->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.13.1</version>
            </dependency>
    
            <!--io流-->
            <dependency>
                <groupId>commons-io</groupId>
                <artifactId>commons-io</artifactId>
                <version>2.4</version>
            </dependency>
    
        </dependencies>
    

    2. 封装工具类

        /**
         * 大数据写 快速写重构
         * @param fileName
         * @param sheetName
         * @param rowBeginIndex
         * @param row
         * @param col
         * @param path
         * @return
         */
        public boolean writeExcelByPoiSXSSFBigData(
                String fileName, String sheetName,
                int rowBeginIndex, List<String> row,
                List<List<Object>> col,
                String path
        ) throws IOException{
            // 处理文件后缀名 即 路径
            fileName += ".xlsx";
            path += fileName;
    
            // 创建表格
            Workbook workbook = new SXSSFWorkbook();
            Sheet sheet = workbook.createSheet(sheetName);
            // 起始行
            Row row1 = sheet.createRow(rowBeginIndex);
            int rowLen = row.size();
            for (int i = 0; i < rowLen; i++) {
                // 第一行 第几列 初始化
                row1.createCell(i).setCellValue(row.get(i));
            }
    
            // 文件内容
            // 内容记录 行数
            int colLen = col.size();
            for (int i = rowBeginIndex + 1; i < colLen + rowBeginIndex + 1; i++) {
                // 多少行内容
                Row temp = sheet.createRow(i);
                for (int j = 0; j < col.get(i - rowBeginIndex - 1).size(); j++) {
                    // 每行内容写入文件
                    temp.createCell(j).setCellValue(col.get(i - rowBeginIndex - 1).get(j).toString());
                }
            }
    
            // IO操作
            FileOutputStream out = null;
            try {
                out = new FileOutputStream(path);
                workbook.write(out);// 写文件
                //清空临时文件
                ((SXSSFWorkbook)workbook).dispose();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } finally {
                out.close();
                workbook.close();
            }
            return true;
        }
    
    
        /***
         *
         * 解决poi 单元格数据类型转换问题
         * @param cell 单元格
         * @return Object 单元格值
         * @author 掌灬纹
         * @since 2021/3/1
         */
        public Object readExcelAllTypes(Cell cell){
            // 获取单元格枚举类型
            Object value = "";
            CellType cellType = cell.getCellType();
    
            if (null != cellType){
                // 类型非空
                switch (cellType){
                    case STRING:
                        value = cell.getStringCellValue();
                        break;
                    case BOOLEAN:
                        value = cell.getBooleanCellValue();
                        break;
                    case NUMERIC: // 日期 数字处理
                        if (DateUtil.isCellDateFormatted(cell)){
                            // 日期格式
                            DateTime dateTime = new DateTime(cell.getDateCellValue());
                            value = dateTime.toString("yyyy-MM-dd");
                        }else {
                            // 数字 转为字符串处理 防止科学计数法
                            cell.setCellType(CellType.STRING);
                            value = cell.getStringCellValue();
                        }
                        break;
                    case BLANK: // 空格
                        value = "";
                        break;
                    case ERROR:
                        System.out.println("error: Error Type");
                        break;
                }
            }
            return value;
        }
    

    3.数据转化(json->excel)

    /**
     *
     * 游戏数据:json格式文件 转换 excel表格
     * @author 掌灬纹
     */
    public class JsonToExcel {
        public static void main(String[] args) throws IOException {
            // 读取json文件
            String url = "E:\\";
            String json = getJson(url + "level.json");
            //System.out.println(json);
    
            List<Level> levelList = new ArrayList<Level>();
    
            // 解析json字符串
            JSONObject jsonObject = JSON.parseObject(json);
            // 获取关卡总数
            Integer levelCount = jsonObject.getInteger("levelCount");
            for (int i = 1; i <= levelCount; i++){
                // 获取每关内容
                JSONObject temp = JSON.parseObject(jsonObject.get("level").toString());
                //System.out.println(temp.get(i));
                // 封装java对象
                Level curLev = initCurLevel(JSON.parseObject(temp.get(i).toString()), i);
                levelList.add(curLev);
            }
    
            // 写excel
            // 行初始化
            List<String> row = new ArrayList<String>();
            row.add("level");
            row.add("content");
            row.add("allRow");
            row.add("allCol");
            row.add("heroRow");
            row.add("heroCol");
            row.add("allTime");
            // 内容初始化
            List<List<Object>> col = new ArrayList<List<Object>>();
            for (Level e:levelList) {
                List<Object> temp = new ArrayList<Object>();
                temp.add(e.getId());
                temp.add(contentToArray(e.getContent()));
                temp.add(e.getAllRow());
                temp.add(e.getAllCol());
                temp.add(e.getHeroRow());
                temp.add(e.getHeroCol());
                temp.add(e.getAllTime() == null ? 60 : e.getAllTime());
                col.add(temp);
            }
            new PoiUtils().writeExcelByPoiSXSSFBigData(
                    "[excel]游戏数据" + System.currentTimeMillis(),
                    "游戏数据", 0,row,col,url
            );
    
        }
    
        /**
         * 数组内容转换 object 为 整形数组 在转为字符串
         * @param content
         * @return
         */
        private static String contentToArray(Object[] content) {
            int len = content.length;
            StringBuilder res = new StringBuilder();
            for (int i = 0; i < len; i++) {
                res.append((Integer) (content[i]));
                if (i != len-1){
                    res.append(", ");
                }
            }
            return res.toString();
        }
    
        /**
         * 初始化当前关卡对象
         * json 转 Java对象
         * @param parseObject
         * @param index 当前关卡数
         * @return
         */
        private static Level initCurLevel(JSONObject parseObject, int index) {
            Level level = new Level();
            level.setId(index);
            level.setContent(parseObject.getJSONArray("content").toArray());
            level.setAllCol(parseObject.getInteger("allCol"));
            level.setAllRow(parseObject.getInteger("allRow"));
            level.setAllTime(parseObject.getInteger("allTime"));
            level.setHeroCol(parseObject.getInteger("heroCol"));
            level.setHeroRow(parseObject.getInteger("heroRow"));
            return level;
    
        }
    
    
        /**
         * 读取本地 json文件
         * @param url
         * @return
         */
        private static String getJson(String url) {
            String result = "";
    
            File file = null;
            Reader reader = null;
            try {
                file = new File(url);
                reader = new InputStreamReader(new FileInputStream(file),"UTF-8");
                int ch = 0;
                StringBuffer sb = new StringBuffer();
                while ((ch = reader.read()) != -1) {
                    sb.append((char) ch);
                }
                result = sb.toString();
                // 关闭流
                reader.close();
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }catch (IOException e){
                e.printStackTrace();
            }
    
    
            return result;
        }
    }
    
    ~彩蛋:读取数据生成的游戏关卡界面 游戏界面.jpg

    相关文章

      网友评论

        本文标题:游戏数据读取写入:Java操作Excel与Json文件

        本文链接:https://www.haomeiwen.com/subject/xecdkltx.html