90行代码将xls-to-csv格式转换

项目中的一个小需求。
需要将xls格式的文件转为csv格式的文件,用来存储到数据库中,

90行代码

    <input type="file" id="xls" value="上传xls文件" onchange="generate()">
    <div id='down'></div>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.12.13/xlsx.js"></script>
    
    <script>
        // 处理表头
        function _dealWithHead(obj) {
            let arr = [];
            for (let i in obj) {
                arr.push(obj[i])
            }
            return arr;
        }
        // 处理数据逻辑
        function _changeData(workbook, persons) {
            // let fromTo = '';
            // 遍历每张表读取
            for (let sheet in workbook.Sheets) {
                if (workbook.Sheets.hasOwnProperty(sheet)) {
                    // fromTo = workbook.Sheets[sheet]['!ref'];
                    persons = persons.concat(XLSX.utils.sheet_to_json(workbook.Sheets[sheet]));
                    // break; // 如果只取第一张表,就取消注释这行
                }
            }
            let head = [];
            let p = persons;

            for (let i = 0; i < p.length; i++) {
                head.push(_dealWithHead(p[i]))
            }
            let csvRows = [];
            for (let j = 0; j < head.length; j++) {
                csvRows.push(head[j].join(','))
            }
            let csvString = csvRows.join('\n'); //BOM的方式解决EXCEL乱码问题 let
            BOM = '\uFEFF';
            csvString = BOM + csvString;
            _generateTag(csvString);

        }
        //生成下载标签
        function _generateTag(csvString) {
            let tag = document.createElement('a');
            tag.href = 'data:attachment/csv,' +
                encodeURI(csvString);
            tag.target = '_blank';
            tag.innerHTML = '下载csv文件';
            tag.download = 'result.csv';
            document.getElementById('down').appendChild(tag);
        }

        function generate(e) {
            let files = document.getElementById('xls').files;
            // 拦截其他格式文件
            if (files[0].name.split('.')[1] !== 'xls') {
                alert('文件格式不支持');
                return;
            }
            let fileReader = new FileReader();
            fileReader.onload = function (ev) {
                try {
                    var data = ev.target.result,
                        workbook = XLSX.read(data, {
                            type: 'binary'
                        }), // 以二进制流方式读取得到整份excel表格对象
                        persons = []; // 存储获取到的数据
                } catch (e) {
                    alert('只支持xls格式的文件');
                    return;
                }
                _changeData(workbook, persons);
                // 表格的表格范围,可用于判断表头是否数量是否正确

            };

            // 以二进制方式打开文件
            fileReader.readAsBinaryString(files[0]);
        };
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这是一个例子,希望对你有所帮助: ``` import csv import chardet def detect_file_encoding(filepath): with open(filepath, 'rb') as f: raw_data = f.read() result = chardet.detect(raw_data) return result['encoding'] def convert_to_utf8_csv(filepath): encoding = detect_file_encoding(filepath) with open(filepath, 'r', encoding=encoding) as infile, open('utf8.csv', 'w', newline='', encoding='utf-8') as outfile: reader = csv.reader(infile) writer = csv.writer(outfile) for row in reader: writer.writerow(row) convert_to_utf8_csv('table.csv') ``` 这段代码将会读取表格文件 `table.csv` 的编码,然后将它换为 UTF-8 编码的 CSV 文件 `utf8.csv`。 ### 回答2: 下面是一个用Python编写的代码,可以识别表格文件的格式和编码,并将其换为UTF-8编码的CSV文件。 ```python import chardet import pandas as pd def convert_to_csv(input_file, output_file): # 识别文件编码 with open(input_file, 'rb') as f: result = chardet.detect(f.read()) encoding = result['encoding'] # 读取表格文件 if encoding: df = pd.read_csv(input_file, encoding=encoding) else: df = pd.read_csv(input_file) # 换为UTF-8编码的CSV文件 df.to_csv(output_file, index=False, encoding='utf-8-sig') # 调用示例 input_file = 'input.xlsx' # 输入表格文件的路径和文件名 output_file = 'output.csv' # 输出CSV文件的路径和文件名 convert_to_csv(input_file, output_file) ``` 在调用示例中,需要将`input_file`和`output_file`变量分别替换为实际的文件路径和文件名。该代码会读取输入文件的编码(如果可以检测到),然后使用Pandas库读取表格文件,并将其换为UTF-8编码的CSV文件。最后,输出CSV文件将保存在指定的路径和文件名中。 请注意,该代码中使用了chardet库来识别文件的编码,并使用了pandas库来读取表格文件并将其换为CSV文件。因此,需要确保这两个库已经安装在Python环境中。可以使用以下命令安装这两个库: ``` pip install chardet pandas ``` ### 回答3: 以下是一个示例代码,可以识别表格文件格式并将其换为UTF-8编码的CSV文件: ```python import os import pandas as pd def convert_to_csv(input_file): # 识别文件格式 file_extension = os.path.splitext(input_file)[1].lower() if file_extension == ".csv": # 输入文件已经是CSV格式,无需换 print("输入文件已经是CSV格式,无需换。") return elif file_extension == ".xls" or file_extension == ".xlsx": # 读取Excel文件 try: df = pd.read_excel(input_file) except: print("无法读取Excel文件,请确认文件路径和格式。") return elif file_extension == ".txt": # 读取文本文件 try: df = pd.read_csv(input_file, sep="\t") except: print("无法读取文本文件,请确认文件路径和格式。") return else: print("不支持的文件格式。") return # 换为UTF-8编码的CSV文件 output_file = os.path.splitext(input_file)[0] + ".csv" df.to_csv(output_file, index=False, encoding="utf-8") print("换成功,文件保存为: " + output_file) # 示例调用 convert_to_csv("input.xlsx") ``` 这个示例代码可以根据输入文件文件格式,识别并读取Excel文件(.xls/.xlsx)或者文本文件(.txt),然后将其换为UTF-8编码的CSV文件。如果输入文件已经是CSV格式的,则输出提示信息并不进换。换后的CSV文件将保存在与输入文件相同的路径下,并以.csv为后缀名。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值