2012-04-05 6 views
0

Excelの特定の日付の値を変更するスクリプトを作成しました。 copyを使用して新しいExcelファイルを作成すると、日付の年の部分を除いてすべてが正しくコピーされます。たとえば、2012年4月5日から4/5/2008になります。すべての日付は4年前に戻っているようです。コードは次のとおりです。Python xlutilsが誤った年にコピーする

def exceledit(): 
#open excel sheet               
import xlrd, xlwt, xlutils 
import datetime 
from xlutils.copy import copy 
print 'Opening excel sheet...' 
book = xlrd.open_workbook('test.xls', on_demand=True, formatting_info=True) 
print 'Creating and editing new excel sheet...' 
wbook = copy(book) 
print 'Done creating new excel sheet' 

sh = book.sheet_by_index(0) 
#iterate through dates in excel sheet          
for colnum in range(sh.ncols): 
    date = sh.cell_value(3, colnum+4) 
    #if xlrd finds a date             
    if date: 
     #grab date data              
     year, month, day, hour, minute, second = xlrd.xldate_as_tuple(date\ 
    , book.datemode) 
     #if dates are within the month currently being edited    
     if month == 04: 
      #format excel date information to work with parkh dict   
      format = str(month) + "/" + str(day) + "/" + str(year)   
      print 'Editing ' + format 
      #clear cells to eliminate old information      
      wbook.get_sheet(0).write(6, colnum+6, "") 
      wbook.get_sheet(0).write(5, colnum+6, "") 
    wbook.get_sheet(0).write(7, colnum+6, "") 
      #iterate through hour segments for that day      
      for x in parkh[format]: 
       #if regular hours, insert in "HOURS" row      
       if x[0] == 'Park Hours': 
        wbook.get_sheet(0).write(6, colnum+6, x[1]) 
       #if extra magic hours, insert in respective row    
       if x[0] == 'Extra Magic Hours': 
        #insert in morning row         
        if int(x[1][0:1]) in range(2,9): 
         wbook.get_sheet(0).write(5, colnum+6, x[1]) 
        #insert in evening row         
        else: 
         wbook.get_sheet(0).write(7, colnum+6, x[1]) 

     if month == 05: 
      break 

print 'Done editing. Now saving...' 
wbook.save('new.xls') 
print 'new.xls saved' 

なぜ年を変えているのでしょうか?他の誰かが同じ問題を抱えているのを見たことはありません。

答えて

1

あなたは明らかに1904年日付システムを使用している入力Excelファイルを持っています。ただちに問題が発生するのは、xlutilsがこれらのファイルを正しくコピーすることをサポートしていないことです。幸いな修正はワンライナーであり、あなたがコピーをした後、あなたもあなたのスクリプトでそれを自分で行うことができます。xlwtサポートがDATEMODEが使用されているかを指定レコードの書き込みため

wbook = copy(book) 
wbook.dates_1904 = book.datemode 

これは、コピーの日付のために働きます。 xlwtは残念ながらエクセル魔法の山車にdatetime.datedatetime.datetimeオブジェクトを変換dates_1904設定を無視して

WARNINGあなたがWorksheet.writeを(使用してファイルに書き込むすべての新しい日付の値が)は、正しく書き込まれません。

私が書かれており、Row.__excel_date_dt方法の全身を置き換える修正プログラムをテストしてきました。新しいxlwtリポジトリにコミットされますsoonish。あなたが緊急に必要である場合、それまでの間、ここのコードは次のとおりです。

、Excelで開く1904設定項目をuntickingし、ファイル doesnのを保存することにより、1900システムにファイルを変換しようと
def __excel_date_dt(self, date): 
    adj = False 
    if isinstance(date, dt.date): 
     if self.__parent_wb.dates_1904: 
      epoch_tuple = (1904, 1, 1) 
     else: 
      epoch_tuple = (1899, 12, 31) 
      adj = True 
     if isinstance(date, dt.datetime): 
      epoch = dt.datetime(*epoch_tuple) 
     else: 
      epoch = dt.date(*epoch_tuple) 
    else: # it's a datetime.time instance 
     epoch = dt.datetime(1900, 1, 1)    
     date = dt.datetime.combine(epoch, date) 
    delta = date - epoch 
    xldate = delta.days + delta.seconds/86400.0 
    # Add a day for Excel's missing leap day in 1900 
    if adj and xldate > 59: 
     xldate += 1 
    return xldate  

WARNING 'T WORK - 日付は4年ぶりです。正しく動作するように見える何

はこれです:

  • は、このフォーマットは、例えばテキスト形式で日付を記録 ... XML Spreadsheet 2003 (*.xml)として保存し、Excelでファイルを開きます 1999-12-31T23:59:59.999

  • を保存し、はい、XMLは人間が読めるストレート ボックスの外で...そしてそれを削除...
    <Date1904/>を読み込む行を探し、テキストエディタでXMLファイルを開きますxmlファイル

  • がExcelで変更されたXMLファイルを開き、すべてのデータと
    が保存されるべき書式が、唯一の違いは、厄介な
    1904ボックスはもうチェックされていないことをする必要があります。これをXLSファイルとして保存することができます。

0

私はExcelワークブックでこれを経験しましたが、Pythonを使用していません。同じファイルがWindowsとMacの間をやり取りされると、奇妙なものとなります(これは一般的ではありません)。 Excel for Windowsはデフォルトで「1900」の日付システムに、Excel for Macはデフォルトで「1904」の日付システムに設定されています。 (それぞれのシステムの開始年です)

xlrdのドキュメントとソースコードでは、ワークブックにコード化されているdatemode値を使用することを強くお勧めしますが、これは試してみる価値があると思います明示的にそれはあなたの問題を修正するかどうかを確認するためにxldate_as_tupleに「その他」のモードを与える:

year, month, day, hour, minute, second = xlrd.xldate_as_tuple(date, 
    1 - book.datemode) 

datemodeは1904モードのために1900モードの01になります。 1 - datemodeこれを反転させます。

ところで、あなたは限り、あなたは括弧で囲まれた式でコンマの後に破壊されているようにバックスラッシュのないラインを破ることができます。

関連する問題