WK1 のフォーマットをあれこれ調べている副産物で CSV ファイルから WK1 へ のコンバータができました。 もちろん、ツールは Ruby です。:-) % ruby csv2wk1.rb takako.csv > matu.wk1 の様にして使います。 対応:1-2-3 Worksheet (WK1)
#-------------------------------------------------------------- csv2wk1.rb ^ # CSV > WK1 (LX 1-2-3) 変換 ruby script, 2000-01-31 by guel print [0, 0, 2, 0, 6, 4].pack("C6") row = 0 while gets chomp col = 0 split(",").each do |x| if x != '' then if x =~ /^\-?\d+$/ and x.to_i.abs < 32767 then # 整数: 16bit x = Array[x.to_i].pack("s") # short int print [0xD, 0, 7, 0, 0, col, 0, row, 0].pack("C9"), x elsif x =~ /^\-?\d*(\.\d+)?(e(\+|\-)?\d*)?$/ # 実数: 64 bit x = Array[x.to_f].pack("d") # double float print [0xE, 0, 13, 0, 0x12, col, 0, row, 0].pack("C9"), x else len = x.length + 7 # 文字列 print [0xF, 0, len, 0, 0xFF, col, 0, row, 0].pack("C9"), \ "'" + x, [0].pack("C") end end col += 1 end row += 1 end print [1, 0, 0, 0].pack("C4") #-------------------------------------------------------------- csv2wk1.rb $ |
1-2-3 WK1 file format --------------------- WK1 file は,可変長レコードの集合体です。 それぞれのレコードは,Record Header + Record Body で,後者の長さは不定です。 前者の構造は,
typedef struct sRecHeader { int type; // Record Type int len; // Record Body Length } RECORDHEADER; |
であり,後者の長さの情報が含まれています。 Record Type ですが,以下のような型があります。
typedef enum RecType { BOF = 0x0, // Beginning of file EOF = 0x1, // End of file CALCMODE = 0x2, // Calculation mode CALCORDER = 0x3, // Calculation order SPLIT = 0x4, // Split window type SYNC = 0x5, // Split window sync RANGE = 0x6, // Active worksheet range WINDOW1 = 0x7, // Window 1 record COLW1 = 0x8, // Column width, window 1 WINTWO = 0x9, // Window 2 record COLW2 = 0xA, // Column width, window 2 NAME = 0xB, // Named range BLANK = 0xC, // Blank cell INTEGER = 0xD, // Integer number cell NUMBER = 0xE, // Floating point number LABEL = 0xF, // Label cell FORMULA = 0x10, // Formula cell TABLE = 0x18, // Data table range ORANGE = 0x19, // Query range PRANGE = 0x1A, // Print range SRANGE = 0x1B, // Sort range FRANGE = 0x1C, // Fill range KRANGE1 = 0x1D, // Primary sort key range HRANGE = 0x20, // Distribution range KRANGE2 = 0x23, // Secondary sort key range PROTEC = 0x24, // Global protection FOOTER = 0x25, // Print footer HEADER = 0x26, // Print header SETUP = 0x27, // Print setup MARGINS = 0x28, // Print margins code LABELFMT = 0x29, // Label alignment TITLES = 0x2A, // Print borders GRAPH = 0x2D, // Current graph settings NGRAPH = 0x2E, // Named graph settings CALCCOUNT = 0x2F, // Iteration count UNFORMATTED = 0x30, // Formatted/unformatted print CURSORW12 = 0x31, // Cursor location } RECORDTYPE; |
Count ->
update 2000-06-21, since 2000-06-21
Copyright (c) 2000 by guel. All rights reserved.