万言不如一默 2023-05-18 23:51 采纳率: 66.7%
浏览 17
已结题

MySQL筛选结果导出数据减少怎么解决

我的表格有2000万左右的数据,用navicat经过筛选得到约12万的数据,我需要把这个数据保存下来成为一个表格,我没找到方法直接保存,只好先导出这个结果,但是在导出之后的表格里面我看到只有5万多条数据了,导出过程并没有保错,怎么回事呢?我的想法是把这个结果做成一张表,再和其他表进行联合查询。

  • 写回答

2条回答 默认 最新

  • Roc-xb 领域专家: 后端开发技术领域 2023-05-19 01:52
    关注

    当导出数据量较大的情况下,excel支持最多65535行数据左右。

    参考:

    /**
     * @version 1.0.0
     * @className: BigExcelFileInit
     * @description: excel大数据量导出工具类
     * @author: LiJunYi
     * @create: 2022/7/6 8:45
     */
    public class BigExcelFileInit
    {
        /**
         * xlsx excel 每个 sheet 写入的数据
         */
        private static final int NUM_PER_SHEET = 300000;
    
        /**
         * xlsx excel 每次向 sheet 中写入的数据(分页写入)
         */
        private static final int NUM_BY_TIMES = 50000;
    
        /**
         * excel通用大数据量分sheet分次写入
         *
         * @param passWord    密码
         * @param fileName    文件名字
         * @param data        数据
         * @param filePath    文件路径
         * @param elementType 元素类型
         * @throws Exception 异常
         */
        public static void bigExcelFileInit(List<?> data, String passWord, String fileName, String filePath, Class<?> elementType) throws Exception
        {
            // 获取 sheet 的个数
            int sheetNum = data.size() % NUM_PER_SHEET == 0 ? data.size() / NUM_PER_SHEET : data.size() / NUM_PER_SHEET + 1;
            // 获取每个sheet 写入的次数
            int writeNumPerSheet = NUM_PER_SHEET / NUM_BY_TIMES;
            // 最后一个 sheet 写入的数量
            int writeNumLastSheet = data.size() - (sheetNum - 1) * NUM_PER_SHEET;
            // 最后一个 sheet 写入的次数
            int writeNumPerLastSheet = writeNumLastSheet % NUM_BY_TIMES == 0 ? writeNumLastSheet / NUM_BY_TIMES : writeNumLastSheet / NUM_BY_TIMES + 1;
            // 指定写入的文件
            try(ExcelWriter excelWriter = EasyExcel.write(filePath, elementType).build())
            {
                for (int i = 0; i < sheetNum; i++)
                {
                    String sheetName = "sheet" + i;
                    WriteSheet writeSheet = EasyExcel.writerSheet(i, sheetName).build();
                    // 每个sheet 写入的次数
                    int writeNum = i == sheetNum - 1 ? writeNumPerLastSheet : writeNumPerSheet;
                    // 每个sheet 最后一次写入的最后行数
                    int endEndNum = i == sheetNum - 1 ? data.size() : (i + 1) * NUM_PER_SHEET;
                    for (int j = 0; j < writeNum; j++)
                    {
                        int startNum = i * NUM_PER_SHEET + j * NUM_BY_TIMES;
                        int endNum = j == writeNum - 1 ? endEndNum : i * NUM_PER_SHEET + (j + 1) * NUM_BY_TIMES;
                        excelWriter.write(data.subList(startNum, endNum), writeSheet);
                    }
                }
            }
            if (StrUtil.isNotEmpty(passWord))
            {
                // 设置excel打开密码
                FileReadonlyProtectionUtil.enforceEncryptProtectionExcel(filePath, passWord);
            }
        }
    }
    
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 5月27日
  • 已采纳回答 5月19日
  • 创建了问题 5月18日