2

My code is following.

import csv
import openpyxl

import sys


def convert(input_path, output_path):
    """
    Read a csv file (with no quoting), and save its contents in an excel file.
    """
    wb = openpyxl.Workbook()
    ws = wb.worksheets[0]

    with open(input_path) as f:
        reader = csv.reader(f, delimiter='\t', quoting=csv.QUOTE_NONE)
        for row_index, row in enumerate(reader):
            for col_index, value in enumerate(row):
                ws.cell(row=row_index, column=col_index).value = value

    wb.save(output_path)


def main():
    try:
        input_path, output_path = sys.argv[1:]
    except ValueError:
        print 'Usage: python %s input_path output_path' % (sys.argv[0],)
    else:
        convert(input_path, output_path)


if __name__ == '__main__':
    main()

But I got this error.

Traceback (most recent call last): 
  File "txt2xlsx.py", line 33, in <module> 
    main() 
  File "txt2xlsx.py", line 29, in main 
    convert(input_path, output_path) 
  File "txt2xlsx.py", line 18, in convert 
    ws.cell(row=row_index, column=col_index).value = value 
  File "C:\python27\lib\site-packages\openpyxl\worksheet\worksheet.py", line 350, in cell 
    column = get_column_letter(column) 
  File "C:\python27\lib\site-packages\openpyxl\utils\__init__.py", line 100, in get_column_letter 
    raise ValueError("Invalid column index {0}".format(idx)) 
ValueError: Invalid column index 0 

I think I have installed openpyxl correctly.

And I remember I was using this program without any problem before. I recently bought a new computer so maybe this is a PC configuration issue.. But I can't figure out.

1
  • Do the columns index in openpyxl starts from 0 or 1 ? Commented Aug 25, 2015 at 9:22

1 Answer 1

3

Seems like you are using openpyxl 2.0.0 + ,according to changelog for Openpyxl 2.0.0 -

Cells are referenced with 1-indexing: A1 == cell(row=1, column=1)

The rows and columns index start at 1. So you should make your enumerate() function start at 1 as well. Example -

    for row_index, row in enumerate(reader, 1):
        for col_index, value in enumerate(row, 1):
            ws.cell(row=row_index, column=col_index).value = value

Your particular code would work in openpyxl version less than 2.0.0 , it fails because of the above mentioned change in version 2.0.0 .

Sign up to request clarification or add additional context in comments.

6 Comments

@Anand_S_Kumar Thank you! Would it be enough to just replace the three lines in my original code starting from "for row_index, row in enumerate(reader):" with your three lines of code?
Or should I do something else, too?
That should be enough.
Sure I will. Thank you again!
@Anand_S_Kumar I accepted your answer. Thank you again! By the way, I have another follow-up question at stackoverflow.com/questions/32216635/… Could you have a look?
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.