Tổng quat
Gần 10 năm sau bài đăng gốc, Excel đã không cải thiện việc nhập tệp CSV. Tuy nhiên, tôi thấy rằng việc nhập các bảng HTML sẽ tốt hơn nhiều. Vì vậy, người ta có thể sử dụng Python để chuyển đổi CSV sang HTML và sau đó nhập HTML kết quả sang Excel.
Ưu điểm của phương pháp này là: (a) nó hoạt động đáng tin cậy, (b) bạn không cần gửi dữ liệu của mình đến dịch vụ của bên thứ ba (ví dụ: trang tính Google), (c) không cần cài đặt thêm "chất béo" (LibreOffice, Số, v.v.) đối với hầu hết người dùng, (d) mức cao hơn so với việc kết hợp với các ký tự CR / LF và các dấu BOM, (e) không cần phải sử dụng các cài đặt ngôn ngữ.
Các bước
Các bước sau đây có thể được chạy trên bất kỳ shell nào giống như bash miễn là Python 3 được cài đặt. Mặc dù Python có thể được sử dụng để đọc trực tiếp CSV, csvkit được sử dụng để thực hiện chuyển đổi trung gian sang JSON. Điều này cho phép chúng tôi tránh phải đối phó với những rắc rối CSV trong mã Python của chúng tôi.
Đầu tiên, lưu đoạn script sau dưới dạng json2html.py
. Kịch bản đọc một tệp JSON từ stdin và kết xuất nó dưới dạng bảng HTML:
#!/usr/bin/env python3
import sys, json, html
if __name__ == '__main__':
header_emitted = False
make_th = lambda s: "<th>%s</th>" % (html.escape(s if s else ""))
make_td = lambda s: "<td>%s</td>" % (html.escape(s if s else ""))
make_tr = lambda l, make_cell: "<tr>%s</tr>" % ( "".join([make_cell(v) for v in l]) )
print("<html><body>\n<table>")
for line in json.load(sys.stdin):
lk, lv = zip(*line.items())
if not header_emitted:
print(make_tr(lk, make_th))
header_emitted = True
print(make_tr(lv, make_td))
print("</table\n</body></html>")
Sau đó, cài đặt csvkit trong môi trường ảo và sử dụng csvjson
để cung cấp tệp đầu vào cho tập lệnh của chúng tôi. Đó là một ý tưởng tốt để vô hiệu hóa việc đoán kiểu ô với -I
đối số:
$ virtualenv -p python3 pyenv
$ . ./pyenv/bin/activate
$ pip install csvkit
$ csvjson -I input.csv | python3 json2html.py > output.html
Bây giờ output.html
có thể được nhập trong Excel. Ngắt dòng trong các tế bào sẽ được bảo tồn.
Tùy chọn, bạn có thể muốn dọn sạch môi trường ảo Python của mình:
$ deactivate
$ rm -rf pyenv