将excel表格转成csv格式

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.util.NumberToTextConverter;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;


public class FileUtils {
    /**
     * 将excel表格转成csv格式
     *
     * @param oldFilePath   d:/a.xlsx
     * @param newFilePath   d:/b.csv
     */
    public static void excelToCsv(String oldFilePath, String newFilePath) {
        //写入csv的字符串,格式为行与行之间用回车换行分割,列与列之间逗号分割
        String buffer = "";
        //excel中表格对象,默认取第一个
        Sheet sheet = null;
        //excel读取对象
        Workbook wb = readExcel(oldFilePath);
        //excel中可能存在第一行字段名称为空的情况,对这种列存入set
        Set<Integer> ignoreCol = new HashSet<Integer>();
        //excel中可能存在第一行字段合并多单元格情况(对应表单多选),将合并开始列与结束列作为键值对存入map
        Map<Integer, Integer> merageMap = new HashMap<Integer, Integer>();
        if (wb != null) {
            //获取第一个sheet
            sheet = wb.getSheetAt(0);
            //先对第一行标题进行解析,若是有某列为空,该列进行忽略
            //获取最大行数
            int rownum = sheet.getPhysicalNumberOfRows();
            //获取第一行
            Row row = sheet.getRow(0);
            //获取最大列数
            int colnum = row.getPhysicalNumberOfCells();
            //遍历该excel中所有合并单元格,将第一行的记入map,方便下方取值需要按一列来取
            for (int i = 0; i < sheet.getNumMergedRegions(); i++) {
                CellRangeAddress mergedRegion = sheet.getMergedRegion(i);
                if (mergedRegion.getFirstRow() != 0 || mergedRegion.getFirstRow() != mergedRegion.getLastRow()) {
                    break;
                }
                merageMap.put(mergedRegion.getFirstColumn(), mergedRegion.getLastColumn());
            }
            //遍历第一行单元格,将为空的记录到忽略列集合
            for (int j = 0; j < colnum; j++) {
                String cellData = (String) getCellFormatValue(row.getCell(j));
                if (null == cellData || "".equals(cellData)) {
                    ignoreCol.add(j);
                } else if (merageMap.containsKey(j)) {
                    buffer += cellData;
                    j = merageMap.get(j);
                } else {
                    buffer += cellData;
                }
            }
            //将第一行字段标识行写入buffer
            buffer = buffer.substring(0, buffer.lastIndexOf(",")).toString();
            buffer += "\n";
            buffer += ",";
            buffer += "\n";
            buffer += ",";
            buffer += "\n";
            //默认第二行与第三行为表格说明行,从第四行开始遍历
            for (int i = 3; i < rownum; i++) {
                row = sheet.getRow(i);
                for (int j = 0; j < colnum; j++) {
                    //如果该列第一行无标识则忽略
                    if (ignoreCol.contains(j)) {
                        continue;
                        //若果是合并列,则多列统一算作一个值(表示多选,中间用;分割)
                    } else if (merageMap.containsKey(j)) {
                        String merageValue = "";
                        int endIndex = merageMap.get(j);
                        while (j <= endIndex) {
                            merageValue += (String) getCellFormatValue(row.getCell(j));
                            j++;
                        }
                        j--;
                        merageValue = convert(merageValue);
                        buffer += merageValue;
                    } else {
                        String cellData = (String) getCellFormatValue(row.getCell(j));
                        buffer += cellData;
                    }
                }
                buffer = buffer.substring(0, buffer.lastIndexOf(",")).toString();
                buffer += "\n";
            }
            File saveCSV = new File(newFilePath);
            try {
                if (!saveCSV.exists()) {
                    saveCSV.createNewFile();
                }
                BufferedWriter writer = new BufferedWriter(new FileWriter(saveCSV));
                System.out.println(buffer);
                writer.write(buffer);
                writer.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 将多选的多列值(a,b,,,c,)转为规定格式(a;b;c)
     *
     * @param merageValue
     * @return
     */
    private static String convert(String merageValue) {
        String result = "";
        String[] split = merageValue.split(",");
        for (String str : split) {
            if ("".equals(str)) {
                continue;
            }
            result = result + str + ";";
        }
        if ("".equals(result)) {
            return ",";
        } else {
            return result.substring(0, result.lastIndexOf(";")).toString() + ",";
        }
    }

    /**
     * 读取excel
     *
     * @param filePath
     * @return
     */
    private static Workbook readExcel(String filePath) {
        Workbook wb = null;
        if (filePath == null) {
            return null;
        }
        String extString = filePath.substring(filePath.lastIndexOf("."));
        InputStream is = null;
        try {
            is = new FileInputStream(filePath);
            if (".xls".equals(extString)) {
                return wb = new HSSFWorkbook(is);
            } else if (".xlsx".equals(extString)) {
                return wb = new XSSFWorkbook(is);
            } else {
                return wb = null;
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return wb;
    }

    /**
     * 获取单元格内容
     *
     * @param cell
     * @return
     */
    private static Object getCellFormatValue(Cell cell) {
        Object cellValue = null;
        if (cell != null) {
            //判断cell类型
            switch (cell.getCellType()) {
                case NUMERIC: {
                    //注意:这里获取的数值会自动保留小数,如原值为10读取后为10.0,故需用poi工具类转为原数
                    cellValue = NumberToTextConverter.toText(cell.getNumericCellValue()).replaceAll("\n", " ") + ",";
                    break;
                }
                case FORMULA: {
                    //判断cell是否为日期格式
                    if (DateUtil.isCellDateFormatted(cell)) {
                        //转换为日期格式YYYY-mm-dd
                        cellValue = String.valueOf(cell.getDateCellValue()).replaceAll("\n", " ") + ",";
                        ;
                    } else {
                        //数字
                        cellValue = String.valueOf(cell.getNumericCellValue()).replaceAll("\n", " ") + ",";
                        ;
                    }
                    break;
                }
                case STRING: {
                    cellValue = cell.getRichStringCellValue().getString().replaceAll("\n", " ") + ",";
                    ;
                    break;
                }
                default:
                    cellValue = "";
            }
        } else {
            cellValue = "";
        }
        return cellValue;
    }
}

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 可以使用Excel软件自带的导出功能将Excel表格换为CSV文件。具体步骤如下: 1. 打开Excel表格,选择要导出的工作表。 2. 点击“文件”菜单,选择“另存为”选项。 3. 在“另存为”对话框中,选择“CSV(逗号分隔)(*.csv)”作为文件类型,并指定文件保存路径和文件名。 4. 点击“保存”按钮,确认导出设置。 5. 如果出现提示信息,表示表格中某些内容不能换为CSV格式,可以选择忽略或修改并重新导出。 导出完后,即可得到一个以逗号分隔的CSV文件,可以用任何文本编辑器打开查看。 ### 回答2: 要将Excel表格CSV文件,可以按照以下步骤进行操作: 1. 打开Excel表格,选择你要换的工作表。 2. 在Excel菜单栏中选择“文件”(File)选项,然后选择“另存为”(Save As)。 3. 在“另存为”对话框中,选择存储位置和文件名。在“文件类型”(Save as type)下拉菜单中,选择“CSV(逗号分隔符)(*.csv)”格式。 4. 点击“保存”(Save)按钮,Excel会弹出一个警告对话框,询问是否要保存当前工作表或整个工作簿。根据需要选择相应选项,然后点击“是”(Yes)按钮。 5. 现在,你的Excel表格已经换为CSV文件,并且可以在指定的存储位置找到它。 这样,你就功地将Excel表格为了CSV文件。CSV文件是一种逗号分隔的文本文件格式,适用于许多应用程序的数据导入和导出。请注意,CSV文件不支持Excel的某些功能,如单元格合并、公式等。换后的CSV文件中,每个Excel单元格的值将以逗号分隔,并且每个行都会CSV文件中的一行。 ### 回答3: 将Excel表格CSV文件非常简单。以下是具体的步骤: 1. 打开Excel表格,并确认要换的工作表是活动的。 2. 点击文件选项卡,在菜单中选择“另存为”选项。 3. 在“另存为”对话框中,选择CSV(逗号分隔)的文件格式。 4. 点击“保存”按钮,选择要保存CSV文件的位置和文件名,并点击“确定”按钮。 5. Excel会显示一个警告对话框,说明CSV文件不支持Excel特有的功能。如果您确定换后不需要这些功能,可以点击“是”继续换。 6. 换完后,您将在指定位置找到保存的CSV文件。 请注意以下几点: - CSV文件是一种纯文本格式,不能包含Excel中的公式、图表、宏等。 - CSV文件中的每行代表Excel表格中的一行数据,每个单元格的数据以逗号分隔。 - 如果Excel表格中存在复杂的数据格式或特殊符号,换后的CSV文件可能需要进行一些调整或手动编辑以确保数据正确。 希望以上步骤能帮到您,如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值