Excel 97 ou Biff 8...

Sujets variés concernant le développement en PureBasic
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Excel 97 ou Biff 8...

Message par Progi1984 »

Voilà, je suis en train de travailler le format XLS alias Biff.

Aucun problème pour BIFF version 2 alias Excel 2.1... autant en lecture qu'en écriture.

Mais dorénavant, je dois m'attaquer à BIFF version 8 alias Excel 97 ( car BIFF2 n'est pas lu par OpenOffice :()

Donc je cherche de la doc, des libs, du code sur BIFF 8.

De plus, si quelqu'un arrive à lire le header d'un fichier excel 97/2000, cela m'intéresse grandement !

Doc : http://sc.openoffice.org/excelfileformat.pdf
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

oula c'est un énorme travail tu sais ?

j'ai commencé moi aussi il y a qq temps et j'ai laissé tomber vu l'ampleur de la tache. je dois quand meme avoir sur mon disque qqpart l'include que j'ai commencé.

ceci dit maintenant que excel 2000/2002/XP sauve les fichiers excel en xml j'ai opté au trvail pour cette solution.

voir ici :

biff:
http://www.purebasic.fr/english/viewtop ... ight=excel

xml:
http://purebasic.forum-gratuit.com/viewtopic.php?t=5812
Image
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Dans le lien BIFF que tu viens de me donner, c'est la version 2 de BIFF qui as été utilisé !

Par contre, pour l'include, ca m'intéresse :) si cela ne t'ennuie pas :)
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

c'est un début de truc alors m'en veut pas parceque il y a encore plein d'ajustements à faire mais ca peut te faire économiser un peu de temps :

Code : Tout sélectionner

;------------------------------------------------------------------------------------
; Object:    ExcelWriter (Microsoft Office 97 compatible)
; Created:   By Paul Squires, for VisualBasic and FreeBasic, 2001-11-10
; Converted: By ABBKlaus, for Purebasic 4.0, 2006-04-04
; Modified:  By Flype, 2006-04-20
; Ressource: http://chicago.sourceforge.net/index.html
;------------------------------------------------------------------------------------


;------------------------------------------------------------------------------------
;// Constants
;------------------------------------------------------------------------------------

; BIFF (Binary Interchange File Format)

Enumeration ; MS_BIFF
  #MS_BIFF_V_UNKNOWN = 0
  #MS_BIFF_V2 = 2
  #MS_BIFF_V3 = 3
  #MS_BIFF_V4 = 4
  #MS_BIFF_V5 = 5
  #MS_BIFF_V7 = 7 ; Excel 95
  #MS_BIFF_V8 = 8 ; Excel 97
EndEnumeration

Enumeration ; MS_BIFF_CRYPTO
  #MS_BIFF_CRYPTO_NONE = 0
  #MS_BIFF_CRYPTO_XOR
  #MS_BIFF_CRYPTO_RC4
  #MS_BIFF_CRYPTO_UNKNOWN
EndEnumeration

Enumeration ; MS_BIFF_TYPE
	#MS_BIFF_TYPE_Workbook   = $0005
	#MS_BIFF_TYPE_VBModule   = $0006
	#MS_BIFF_TYPE_Worksheet  = $0010
	#MS_BIFF_TYPE_Chart      = $0020
	#MS_BIFF_TYPE_Macrosheet = $0040
	#MS_BIFF_TYPE_Workspace  = $0100
EndEnumeration

Enumeration ; BIFF
  #XLS_BIFF_BLANK         = $01
  #XLS_BIFF_INTEGER       = $02
  #XLS_BIFF_REAL          = $03
  #XLS_BIFF_TEXT          = $04
  #XLS_BIFF_BOOLERR       = $05
  #XLS_BIFF_FORMULA       = $06
  #XLS_BIFF_STRING        = $07
  #XLS_BIFF_ROW           = $08
  #XLS_BIFF_BOF           = $09
  #XLS_BIFF_EOF           = $0A
  #XLS_BIFF_PROTECT       = $12
  #XLS_BIFF_HEADER        = $14
  #XLS_BIFF_FOOTER        = $15
  #XLS_BIFF_NAME          = $18
  #XLS_BIFF_HPAGEBREAK    = $1B
  #XLS_BIFF_SELECTION     = $1D
  #XLS_BIFF_FORMAT        = $1E
  #XLS_BIFF_COUNT         = $1F
  #XLS_BIFF_COLWIDTH      = $24
  #XLS_BIFF_DEFROWHEIGHT  = $25
  #XLS_BIFF_MARGIN_LEFT   = $26
  #XLS_BIFF_MARGIN_RIGHT  = $27
  #XLS_BIFF_MARGIN_TOP    = $28
  #XLS_BIFF_MARGIN_BOTTOM = $29
  #XLS_BIFF_PRINTGRID     = $2B
  #XLS_BIFF_FILEPASS      = $2F
  #XLS_BIFF_FONT          = $31
  #XLS_BIFF_WINDOW1       = $3D
  #XLS_BIFF_WINDOW2       = $3E
  #XLS_BIFF_PANE          = $41
  #XLS_BIFF_DEFCOLWIDTH   = $55
  #XLS_BIFF_COLINFO       = $7D
  #XLS_BIFF_BOUNDSHEET    = $85
  #XLS_BIFF_XF            = $E0
EndEnumeration
Enumeration ; Cells Type
  #XLS_CellNormal = 0
  #XLS_CellLocked = 64
  #XLS_CellHidden = 128
EndEnumeration
Enumeration ; Cells Alignment/border
  #XLS_GeneralAlign = 0
  #XLS_LeftAlign    = 1
  #XLS_CentreAlign  = 2
  #XLS_RightAlign   = 3
  #XLS_FillCell     = 4
  #XLS_LeftBorder   = 8
  #XLS_RightBorder  = 16
  #XLS_TopBorder    = 32
  #XLS_BottomBorder = 64
  #XLS_Shaded       = 128
EndEnumeration
Enumeration ; Fonts Id
  #XLS_Font0 = 0
  #XLS_Font1 = 64
  #XLS_Font2 = 128
  #XLS_Font3 = 192
EndEnumeration
Enumeration ; Fonts Decoration
  #XLS_NoFormat  = 0
  #XLS_Bold      = 1
  #XLS_Italic    = 2
  #XLS_Underline = 4
  #XLS_Strikeout = 8
EndEnumeration

;------------------------------------------------------------------------------------
;// Structures
;------------------------------------------------------------------------------------

Structure XLS_BIFF
  opcode.w
  length.w
EndStructure
Structure XLS_BIFF_BLANK        Extends XLS_BIFF
  rw.w
  Col.b
  ixfe.w
EndStructure
Structure XLS_BIFF_BOF          Extends XLS_BIFF
  vers.w
  dt.w
EndStructure
Structure XLS_BIFF_BOOLERR      Extends XLS_BIFF
  rw.w
  Col.b
  ixfe.w
  bBoolErr.b
  fError.b
EndStructure
Structure XLS_BIFF_BOUNDSHEET   Extends XLS_BIFF
  reserved.b
  cch.b
  ;rgch
EndStructure
Structure XLS_BIFF_COLINFO      Extends XLS_BIFF ; [PXL 1.0]
  Col.w
  grbit.w
  ixfe.w
EndStructure
Structure XLS_BIFF_COLINFO2     Extends XLS_BIFF ; [PXL 2.0]
  colFirst.w
  colLast.w
  coldx.w
  ixfe.w
  grbit.b
EndStructure
Structure XLS_BIFF_COLWIDTH     Extends XLS_BIFF
  column1.b
  column2.b
  width.w
EndStructure
Structure XLS_BIFF_DEFROWHEIGHT Extends XLS_BIFF
  grbit.w
  miyRw.w
EndStructure
Structure XLS_BIFF_DEFCOLWIDTH  Extends XLS_BIFF ; [PXL 2.0]
  grbit.w
  coldx.w
  ixfe.w
EndStructure
Structure XLS_BIFF_EOF          Extends XLS_BIFF
  ;empty
EndStructure
Structure XLS_BIFF_FILEPASS     Extends XLS_BIFF
  ;empty
EndStructure
Structure XLS_BIFF_FONT         Extends XLS_BIFF
  dwHeight.w
  grbit.b
  Reserved1.w
  bls.w
  Reserved2.w
  uls.b
  bFamily.b
  bCharSet.b
  reserved3.b
  cch.b
  ;rgch
EndStructure
Structure XLS_BIFF_FORMAT       Extends XLS_BIFF
  cce.b
  ;rgch
EndStructure
Structure XLS_BIFF_FORMULA      Extends XLS_BIFF
  rw.w
  Col.b
  ixfe.w
  num.d
  grbit.b
  cce.w
  ;rgce
EndStructure
Structure XLS_BIFF_LABEL        Extends XLS_BIFF
  rw.w
  Col.b
  ixfe.w
  cch.w
  ;rgch
EndStructure
Structure XLS_BIFF_NAME         Extends XLS_BIFF ; [PXL 1.0]
  cch.b
  cce.w
  ixals.w
  ;rgch
  ;rgce
EndStructure
Structure XLS_BIFF_NAME2        Extends XLS_BIFF ; [PXL 2.0]
  grbit.w
  cch.b
  cce.w
  ixals.w
  ;rgch
  ;rgce
EndStructure
Structure XLS_BIFF_NUMBER       Extends XLS_BIFF
  rw.w
  Col.b
  ixfe.w
  num.d
EndStructure
Structure XLS_BIFF_PANE         Extends XLS_BIFF ; [PXL 2.0]
  x.w
  miyRw.w
  grbit.w
  ixfe.w
EndStructure
Structure XLS_BIFF_ROW          Extends XLS_BIFF
  rw.w
  y.w
  rwTop.w
  colLeft.w
  pnnAct.b
EndStructure
Structure XLS_BIFF_SELECTION    Extends XLS_BIFF
  rwTop.w
  colLeft.w
  rwBottom.w
  colRight.b
  rwActive.w
  colActive.b
EndStructure
Structure XLS_BIFF_STRING       Extends XLS_BIFF
  cch.b
  ;rgch
EndStructure
Structure XLS_BIFF_WINDOW1      Extends XLS_BIFF ; [PXL 2.0]
  grbit.w
  itabCur.w
EndStructure
Structure XLS_BIFF_WINDOW2      Extends XLS_BIFF ; [PXL 1.0]
  rwTop.w
  colLeft.b
  grbit.w
EndStructure
Structure XLS_BIFF_WINDOW2_     Extends XLS_BIFF ; [PXL 2.0]
  rwTop.w
  colLeft.b
  grbit.w
EndStructure
Structure XLS_BIFF_XF           Extends XLS_BIFF ; [PXL 1.0]
  ixfnt.w
  ixfmtParent.w
  ixnf.w
  fAttributes.l
  fBaseAttr.w
  fTextAttr.w
  icvFore.w
  icvFill.w
  icvBorder.w
  backStyle.b
  borderStyle.b
EndStructure
Structure XLS_BIFF_XF_          Extends XLS_BIFF ; [PXL 2.0]
  ixfnt.w
  ixnf.w
  fAttributes.l
  fBaseAttr.w
  fTextAttr.w
  icvFore.w
  icvFill.w
  bRight.b
  bTop.b
  bLeft.b
  bBottom.b
  backStyle.b
  borderStyle.b
EndStructure

Structure XLS_BIFF_COUNT        Extends XLS_BIFF
  count.w
EndStructure
Structure XLS_BIFF_HEADER       Extends XLS_BIFF
  textLen.b
EndStructure
Structure XLS_BIFF_FOOTER       Extends XLS_BIFF
  textLen.b
EndStructure
Structure XLS_BIFF_ROWHEIGHT    Extends XLS_BIFF
  row.w
  column1.w
  column2.w
  height.w
  Internal.w
  defAttr.b
  offset.w
  attr1.b
  attr2.b
  attr3.b
EndStructure
Structure XLS_BIFF_HPAGEBREAK   Extends XLS_BIFF
  number.w
EndStructure
Structure XLS_BIFF_MARGIN       Extends XLS_BIFF
  Value.d
EndStructure
Structure XLS_BIFF_PRINTGRID    Extends XLS_BIFF
  print.w
EndStructure
Structure XLS_BIFF_PROTECT      Extends XLS_BIFF
  Protect.w
EndStructure
Structure XLS_BIFF_DATA         Extends XLS_BIFF
  row.w
  column.w
  attr1.b
  attr2.b
  attr3.b
EndStructure
Structure XLS_BIFF_INTEGER      Extends XLS_BIFF_DATA
  integer.w
EndStructure
Structure XLS_BIFF_TEXT         Extends XLS_BIFF_DATA
  textLen.b
EndStructure

Structure XLS_BIFF_PASSWORD     Extends XLS_BIFF
  ; à définir
EndStructure

;------------------------------------------------------------------------------------
;// Private functions
;------------------------------------------------------------------------------------

Global xlsFileNumber.l

Procedure.d XLS_TimeToDouble(strTime.s)
  
  Protected h.l, m.l, s.l, d.d
  
  If Len(strTime) = 8
    
    h = Val(Mid(strTime, 1, 2))
    m = Val(Mid(strTime, 4, 2))
    s = Val(Mid(strTime, 7, 2))
    d = (h * 3600 + m * 60 + s) / 86400
    
  EndIf
  
  ProcedureReturn d
  
EndProcedure
Procedure.l XLS_DateToJulian(strDate.s)
  
  Protected y.l, m.l, d.l
  
  If Len(strDate) = 8
    
    y = Val(Mid(strDate, 1, 4))
    m = Val(Mid(strDate, 5, 2)) : If m < 3 : m + 12 : y - 1 : EndIf
    d = Val(Mid(strDate, 7, 2))
    d + Int((y+4712)*365.25)
    d + Int(30.6*(m-1)+0.2)
    d + (y/400)
    d - (y/100)
    
  EndIf
  
  ProcedureReturn d
  
EndProcedure
Procedure.l XLS_WriteToFile(*lpBuffer, nNumberOfBytesToWrite.l)
  
  Protected NumberOfBytesWritten.l
  
  If xlsFileNumber
    If WriteFile_(xlsFileNumber, *lpBuffer, nNumberOfBytesToWrite, @NumberOfBytesWritten, #Null)
      ProcedureReturn NumberOfBytesWritten
    EndIf
  EndIf
  
EndProcedure
Procedure.l XLS_WriteDefaultFormats() ; bug inside
  
  Protected i.l
  Protected Dim aFormat.s(23)
  Protected record1.XLS_BIFF_COUNT
  Protected record2.XLS_BIFF_FORMAT
  
  aFormat(00) = "General"
  aFormat(01) = "0"
  aFormat(02) = "0.00"
  aFormat(03) = "#,##0"
  aFormat(04) = "#,##0.00"
  aFormat(05) = "#,##0\ "    + #DQUOTE$ + "$" + #DQUOTE$ + ";\-#,##0\ "         + #DQUOTE$ + "$" + #DQUOTE$
  aFormat(06) = "#,##0\ "    + #DQUOTE$ + "$" + #DQUOTE$ + ";[Red]\-#,##0\ "    + #DQUOTE$ + "$" + #DQUOTE$
  aFormat(07) = "#,##0.00\ " + #DQUOTE$ + "$" + #DQUOTE$ + ";\-#,##0.00\ "      + #DQUOTE$ + "$" + #DQUOTE$
  aFormat(08) = "#,##0.00\ " + #DQUOTE$ + "$" + #DQUOTE$ + ";[Red]\-#,##0.00\ " + #DQUOTE$ + "$" + #DQUOTE$
  aFormat(09) = "0%"
  aFormat(10) = "0.00%"
  aFormat(11) = "0.00E+00"
  aFormat(12) = "yyyy-mm-dd"
  aFormat(13) = "dd/\ mmm\ yy"
  aFormat(14) = "dd/\ mmm"
  aFormat(15) = "mmm\ yy"
  aFormat(16) = "h:mm\ AM/PM"
  aFormat(17) = "h:mm:ss\ AM/PM"
  aFormat(18) = "hh:mm"
  aFormat(19) = "hh:mm:ss"
  aFormat(20) = "dd/mm/yy\ hh:mm"
  aFormat(21) = "##0.0E+0"
  aFormat(22) = "mm:ss"
  aFormat(23) = "@"
  
  record1\opcode = #XLS_BIFF_COUNT
  record1\length = SizeOf(XLS_BIFF_COUNT)
  record1\length - SizeOf(XLS_BIFF)
  record1\count  = 23
  
  If xlsFileNumber
    If XLS_WriteToFile(record1, SizeOf(XLS_BIFF_COUNT))
      For i = 0 To 23
        record2\opcode    = #XLS_BIFF_FORMAT
        record2\length    = SizeOf(XLS_BIFF_FORMAT)
        record2\length    - SizeOf(XLS_BIFF)
        record2\length    + Len(aFormat(i))
        ;record2\formatLen = Len(aFormat(i))
        If XLS_WriteToFile(record2, SizeOf(XLS_BIFF_FORMAT)) = #False
          Break
        EndIf
        If XLS_WriteToFile(@aFormat(i), record2\length) = #False
          Break
        EndIf
      Next
      ProcedureReturn #True
    EndIf
  EndIf
  
EndProcedure

;------------------------------------------------------------------------------------
;// Public functions
;------------------------------------------------------------------------------------

DeclareDLL.l XLS_CloseFile()
DeclareDLL.l XLS_CreateFile(filename.s)
DeclareDLL.l XLS_End()
DeclareDLL.l XLS_Init()
DeclareDLL.l XLS_InsertHorizPageBreak(row.l)
DeclareDLL.l XLS_PrintGridLines(bool.l)
DeclareDLL.l XLS_ProtectSpreadsheet(bool.l)
DeclareDLL.l XLS_SetColumnWidth(column1.l, column2.l, width.l)
DeclareDLL.l XLS_SetDefaultRowHeight(height.l)
DeclareDLL.l XLS_SetFilePassword(pwd.s)
DeclareDLL.l XLS_SetFont(name.s, height.l, format.l)
DeclareDLL.l XLS_SetFooter(footer.s)
DeclareDLL.l XLS_SetHeader(Header.s)
DeclareDLL.l XLS_SetMarginLeft(Value.d)
DeclareDLL.l XLS_SetMarginRight(Value.d)
DeclareDLL.l XLS_SetMarginTop(Value.d)
DeclareDLL.l XLS_SetMarginBottom(Value.d)
DeclareDLL.l XLS_SetRowHeight(row.l, height.l)
DeclareDLL.l XLS_WriteDate(date.s, mask.s, row.l, Col.l, CellFont.l=0, CellAlignment.l=0, HiddenLocked.l=0, CellFormat.l=0)
DeclareDLL.l XLS_WriteInteger(integer.w ,row.l ,column.l, CellFont.l=0, CellAlignment.l=0, HiddenLocked.l=0, CellFormat.l=0)
DeclareDLL.l XLS_WriteReal(number.d, row.l, column.l, CellFont.l=0, CellAlignment.l=0, HiddenLocked.l=0, CellFormat.l=0)
DeclareDLL.l XLS_WriteText(text.s, row.l, column.l, CellFont.l=0, CellAlignment.l=0, HiddenLocked.l=0, CellFormat.l=0)

ProcedureDLL.l XLS_Init()
  
  Global NewList XLS_HorizPageBreakRows.l() ; .w ?
  
EndProcedure
ProcedureDLL.l XLS_CreateFile(filename.s)
  
  Protected record.XLS_BIFF_BOF
  
  If FileSize(filename) >= 0
    If DeleteFile(filename) = #False
      ProcedureReturn -1
    EndIf
  EndIf
  
  xlsFileNumber = CreateFile_(@filename, #GENERIC_READ|#GENERIC_WRITE, #FILE_SHARE_READ, 0, #CREATE_ALWAYS, #FILE_ATTRIBUTE_NORMAL, 0)
  
  If xlsFileNumber
    
    record\opcode  = #XLS_BIFF_BOF
    record\length  = SizeOf(XLS_BIFF_BOF)
    record\length  - SizeOf(XLS_BIFF)
    record\vers    = 2
    record\dt      = #MS_BIFF_TYPE_Worksheet
    
    XLS_WriteToFile(record, SizeOf(XLS_BIFF_BOF))
    ClearList(XLS_HorizPageBreakRows())
    XLS_WriteDefaultFormats()
    
    ProcedureReturn #True
    
  EndIf
  
EndProcedure
ProcedureDLL.l XLS_CloseFile()
  
  Protected numPageBreak.l, Buffer.w
  Protected record1.XLS_BIFF_HPAGEBREAK
  Protected record2.XLS_BIFF_EOF
  
  numPageBreak.l = CountList(XLS_HorizPageBreakRows())
  
  If numPageBreak
    
    SortList(XLS_HorizPageBreakRows(), 0)
    
    record1\opcode = #XLS_BIFF_HPAGEBREAK
    record1\length = SizeOf(XLS_BIFF_HPAGEBREAK)
    record1\length - SizeOf(XLS_BIFF)
    record1\length + (numPageBreak * 2)
    record1\number = numPageBreak
    
    If XLS_WriteToFile(record1, SizeOf(XLS_BIFF_HPAGEBREAK))
      ForEach XLS_HorizPageBreakRows()
        Buffer.w = XLS_HorizPageBreakRows()
        If XLS_WriteToFile(@Buffer, 2) = #False
          ProcedureReturn #False
        EndIf
      Next
    Else
      ProcedureReturn #False
    EndIf
    
  EndIf
  
  record2\opcode = #XLS_BIFF_EOF
  
  If XLS_WriteToFile(record2, SizeOf(XLS_BIFF_EOF))
    If xlsFileNumber And CloseHandle_(xlsFileNumber)
      ClearList(XLS_HorizPageBreakRows())
      xlsFileNumber = #Null
      ProcedureReturn #True
    EndIf
  EndIf
  
EndProcedure
ProcedureDLL.l XLS_End()
  
  XLS_CloseFile()
  ClearList(XLS_HorizPageBreakRows())
  
EndProcedure
ProcedureDLL.l XLS_InsertHorizPageBreak(row.l)
  
  If xlsFileNumber And AddElement(XLS_HorizPageBreakRows())
    XLS_HorizPageBreakRows() = (row & $FFFF)
  EndIf
  
EndProcedure
ProcedureDLL.l XLS_PrintGridLines(bool.l)
  
  Protected record.XLS_BIFF_PRINTGRID
  
  record\opcode = #XLS_BIFF_PRINTGRID
  record\length = SizeOf(XLS_BIFF_PRINTGRID)
  record\length - SizeOf(XLS_BIFF)
  record\print  = bool
  
  ProcedureReturn XLS_WriteToFile(record, SizeOf(XLS_BIFF_PRINTGRID))
  
EndProcedure
ProcedureDLL.l XLS_ProtectSpreadsheet(bool.l)
  
  Protected record.XLS_BIFF_PROTECT
  
  record\opcode  = #XLS_BIFF_PROTECT
  record\length  = SizeOf(XLS_BIFF_PROTECT)
  record\length  - SizeOf(XLS_BIFF)
  record\Protect = bool
  
  ProcedureReturn XLS_WriteToFile(record, SizeOf(XLS_BIFF_PROTECT))
  
EndProcedure
ProcedureDLL.l XLS_SetMarginLeft(Value.d)
  
  Protected record.XLS_BIFF_MARGIN
  
  record\opcode = #XLS_BIFF_MARGIN_LEFT
  record\length = SizeOf(XLS_BIFF_MARGIN)
  record\length - SizeOf(XLS_BIFF)
  record\Value  = Value
  
  ProcedureReturn XLS_WriteToFile(record, SizeOf(XLS_BIFF_MARGIN))
  
EndProcedure
ProcedureDLL.l XLS_SetMarginRight(Value.d)
  
  Protected record.XLS_BIFF_MARGIN
  
  record\opcode = #XLS_BIFF_MARGIN_RIGHT
  record\length = SizeOf(XLS_BIFF_MARGIN)
  record\length - SizeOf(XLS_BIFF)
  record\Value  = Value
  
  ProcedureReturn XLS_WriteToFile(record, SizeOf(XLS_BIFF_MARGIN))
  
EndProcedure
ProcedureDLL.l XLS_SetMarginTop(Value.d)
  
  Protected record.XLS_BIFF_MARGIN
  
  record\opcode = #XLS_BIFF_MARGIN_TOP
  record\length = SizeOf(XLS_BIFF_MARGIN)
  record\length - SizeOf(XLS_BIFF)
  record\Value  = Value
  
  ProcedureReturn XLS_WriteToFile(record, SizeOf(XLS_BIFF_MARGIN))
  
EndProcedure
ProcedureDLL.l XLS_SetMarginBottom(Value.d)
  
  Protected record.XLS_BIFF_MARGIN
  
  record\opcode = #XLS_BIFF_MARGIN_BOTTOM
  record\length = SizeOf(XLS_BIFF_MARGIN)
  record\length - SizeOf(XLS_BIFF)
  record\Value  = Value
  
  ProcedureReturn XLS_WriteToFile(record, SizeOf(XLS_BIFF_MARGIN))
  
EndProcedure
ProcedureDLL.l XLS_SetColumnWidth(column1.l, column2.l, width.l)
  
  Protected record.XLS_BIFF_COLWIDTH
  
  record\opcode  = #XLS_BIFF_COLWIDTH
  record\length  = SizeOf(XLS_BIFF_COLWIDTH)
  record\length  - SizeOf(XLS_BIFF)
  record\column1 = (column1 & $FF)
  record\column2 = (column2 & $FF)
  record\width   = (width * 256)
  
  ProcedureReturn XLS_WriteToFile(record, SizeOf(XLS_BIFF_COLWIDTH))
  
EndProcedure
ProcedureDLL.l XLS_SetFont(name.s, height.l, format.l)
  
  Protected record.XLS_BIFF_FONT
  
  record\opcode   = #XLS_BIFF_FONT
  record\length   = SizeOf(XLS_BIFF_FONT)
  record\length   - SizeOf(XLS_BIFF)
  record\length   + Len(name)
  record\dwHeight = (height * 20)
 ; record\attrs1   = (format & $FF)
 ; record\attrs2   = #Null
  record\cch      = (Len(name) & $FF)
  
  If XLS_WriteToFile(record, SizeOf(XLS_BIFF_FONT))
    ProcedureReturn XLS_WriteToFile(@name, Len(name))
  EndIf
  
EndProcedure
ProcedureDLL.l XLS_SetHeader(Header.s)
  
  Protected record.XLS_BIFF_HEADER
  
  record\opcode  = #XLS_BIFF_HEADER
  record\length  = SizeOf(XLS_BIFF_HEADER)
  record\length  - SizeOf(XLS_BIFF)
  record\length  + Len(Header)
  record\textLen = (Len(Header) & $FF)
  
  If XLS_WriteToFile(record, SizeOf(XLS_BIFF_HEADER))
    ProcedureReturn XLS_WriteToFile(@Header, Len(Header))
  EndIf
  
EndProcedure
ProcedureDLL.l XLS_SetFooter(footer.s)
  
  Protected record.XLS_BIFF_FOOTER
  
  record\opcode  = #XLS_BIFF_FOOTER
  record\length  = SizeOf(XLS_BIFF_FOOTER)
  record\length  - SizeOf(XLS_BIFF)
  record\length  + Len(footer)
  record\textLen = (Len(footer) & $FF)
  
  If XLS_WriteToFile(record, SizeOf(XLS_BIFF_FOOTER))
    ProcedureReturn XLS_WriteToFile(@footer, Len(footer))
  EndIf
  
EndProcedure
ProcedureDLL.l XLS_SetFilePassword(pwd.s)
  
  Protected record.XLS_BIFF_PASSWORD
  
 ; record\opcode = #XLS_BIFF_PASSWORD
 ; record\length = SizeOf(XLS_BIFF_PASSWORD)
 ; record\length - SizeOf(XLS_BIFF)
 ; record\length + Len(pwd)
 ; 
 ; If XLS_WriteToFile(record, SizeOf(XLS_BIFF_PASSWORD))
 ;   ProcedureReturn XLS_WriteToFile(@pwd, Len(pwd))
 ; EndIf
  
EndProcedure
ProcedureDLL.l XLS_SetDefaultRowHeight(height.l)
  
  Protected record.XLS_BIFF_DEFROWHEIGHT
  
  ; record\opcode = #XLS_BIFF_DEFROWHEIGHT
  ; record\length = SizeOf(XLS_BIFF_DEFROWHEIGHT)
  ; record\length - SizeOf(XLS_BIFF)
  ; record\height = (height * 20)
  
  ProcedureReturn XLS_WriteToFile(record, SizeOf(XLS_BIFF_DEFROWHEIGHT))
  
EndProcedure
ProcedureDLL.l XLS_SetSheetName(name.s)
  
  Protected record.XLS_BIFF_BOUNDSHEET
  
  record\opcode   = #XLS_BIFF_BOUNDSHEET
  record\length   = SizeOf(XLS_BIFF_BOUNDSHEET)
  record\length   - SizeOf(XLS_BIFF)
  record\length   + Len(name)
  record\reserved = #Null
  record\cch      = (Len(name) & $FF)
  
  If XLS_WriteToFile(record, SizeOf(XLS_BIFF_BOUNDSHEET))
    ProcedureReturn XLS_WriteToFile(@name, record\cch)
  EndIf
  
EndProcedure
ProcedureDLL.l XLS_SetRowHeight(row.l, height.l)
  
  Protected record.XLS_BIFF_ROWHEIGHT
  
  ; record\opcode   = #XLS_BIFF_ROWHEIGHT
  ; record\length   = SizeOf(XLS_BIFF_ROWHEIGHT)
  ; record\length   - SizeOf(XLS_BIFF)
  ; record\row      = (row & $FFFF)
  ; record\column1  = 0
  ; record\column2  = 256
  ; record\height   = (height * 20)
  ; record\Internal = 0
  ; record\defAttr  = 0
  ; record\offset   = 0
  ; record\attr1    = 0
  ; record\attr2    = 0
  ; record\attr3    = 0
  ; 
  ; ProcedureReturn XLS_WriteToFile(record, SizeOf(XLS_BIFF_ROWHEIGHT))
  
EndProcedure
ProcedureDLL.l XLS_WriteDate(datetime.s, mask.s, row.l, column.l, CellFont.l=0, CellAlignment.l=0, HiddenLocked.l=0, CellFormat.l=0)
  
  Protected dDatetime.d
  ; Protected record.XLS_BIFF_REAL
  ; 
  ; datetime = FormatDate("%yyyy%mm%dd %hh:%ii:%ss", ParseDate(mask, datetime))
  ; 
  ; dDatetime = 1
  ; dDatetime - XLS_DateToJulian("19000100")
  ; dDatetime + XLS_DateToJulian(Mid(datetime, 01, 8))
  ; dDatetime + XLS_TimeToDouble(Mid(datetime, 10, 8))
  ; 
  ; record\opcode = #XLS_BIFF_REAL
  ; record\length = SizeOf(XLS_BIFF_REAL)
  ; record\length - SizeOf(XLS_BIFF)
  ; record\row    = (row & $FFFF)
  ; record\column = (column & $FFFF)
  ; record\attr1  = (HiddenLocked & $FF)
  ; record\attr2  = (CellFont | CellFormat & $FF)
  ; record\attr3  = (CellAlignment & $FF)
  ; record\real   = dDatetime
  ; 
  ; ProcedureReturn XLS_WriteToFile(record, SizeOf(XLS_BIFF_REAL))
  
EndProcedure
ProcedureDLL.l XLS_WriteInteger(integer.w, row.l, column.l, CellFont.l=0, CellAlignment.l=0, HiddenLocked.l=0, CellFormat.l=0)
  
  Protected record.XLS_BIFF_INTEGER
  
  record\opcode  = #XLS_BIFF_INTEGER
  record\length  = SizeOf(XLS_BIFF_INTEGER)
  record\length  - SizeOf(XLS_BIFF)
  record\row     = (row & $FFFF)
  record\column  = (column & $FFFF)
  record\attr1   = (HiddenLocked & $FF)
  record\attr2   = (CellFont | CellFormat & $FF)
  record\attr3   = (CellAlignment & $FF)
  record\integer = integer
  
  ProcedureReturn XLS_WriteToFile(record, SizeOf(XLS_BIFF_INTEGER))
  
EndProcedure
ProcedureDLL.l XLS_WriteReal(real.d, row.l, column.l, CellFont.l=0, CellAlignment.l=0, HiddenLocked.l=0, CellFormat.l=0)
  
  ; Protected record.XLS_BIFF_REAL
  ; 
  ; record\opcode = #XLS_BIFF_REAL
  ; record\length = SizeOf(XLS_BIFF_REAL)
  ; record\length - SizeOf(XLS_BIFF)
  ; record\row    = (row & $FFFF)
  ; record\column = (column & $FFFF)
  ; record\attr1  = (HiddenLocked & $FF)
  ; record\attr2  = (CellFont | CellFormat & $FF)
  ; record\attr3  = (CellAlignment & $FF)
  ; record\real   = real
  ; 
  ; ProcedureReturn XLS_WriteToFile(record, SizeOf(XLS_BIFF_REAL))
  
EndProcedure
ProcedureDLL.l XLS_WriteText(text.s, row.l, column.l, CellFont.l=0, CellAlignment.l=0, HiddenLocked.l=0, CellFormat.l=0)
  
  Protected record.XLS_BIFF_TEXT
  
  record\opcode  = #XLS_BIFF_TEXT
  record\length  = SizeOf(XLS_BIFF_TEXT)
  record\length  - SizeOf(XLS_BIFF)
  record\length  + Len(text)
  record\textLen = Len(text)
  record\row     = (row & $FFFF)
  record\column  = (column & $FFFF)
  record\attr1   = (HiddenLocked & $FF)
  record\attr2   = (CellFont | CellFormat & $FF)
  record\attr3   = (CellAlignment & $FF)
  
  If XLS_WriteToFile(record, SizeOf(XLS_BIFF_TEXT))
    ProcedureReturn XLS_WriteToFile(@text, record\textLen)
  EndIf
  
EndProcedure

;------------------------------------------------------------------------------------
;// End of file
;------------------------------------------------------------------------------------
Image
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Merci pour ce code, Flype... A moi de travailler now !

PS : T'as pas un code d'exemple avec ?
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

euh si mais à la maison - oups (je suis déjà au travail).

en fait ce code est une modif (pas fini) pour PB4 du code original.

voici un petit exemple comme çà plus ou moins de tête :

Code : Tout sélectionner

XIncludeFile("ExcelWriter.pb")

XLS_Init()

If XLS_CreateFile("Test.xls")
  
  XLS_SetSheetName("flype")
  XLS_InsertHorizPageBreak(1)
  XLS_InsertHorizPageBreak(2)
  XLS_SetColumnWidth(0, 10, 8)
  XLS_SetDefaultRowHeight(20)
  
  For Col = 0 To 8
    XLS_WriteText( "texte"+Str(Col), 1, Col)
    For row = 5 To 10
      XLS_WriteInteger( row, row, Col)
      XLS_WriteDate(FormatDate("%yyyy-%mm-%dd %hh:%ii:%ss", Date()), "%yyyy-%mm-%dd %hh:%ii:%ss", row, Col)
    Next
  Next
  
  XLS_CloseFile()
  
EndIf
Image
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Quand j'ouvre le fichier généré test.xls, ca ne marche pas ! Il em dit impossible de lire le fichier !
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

ben çà tu verras çà souvent pendant que tu développera le truc jusqu'à ce qu'il soit stable. le moindre octet de faux et excel ne sait plus ouvrir le fichier xls généré.

etant donné l'état d'avancement de mon include ca ne m'étonne pas. il va falloir finir l'include et après s'amuser avec des exemples.

pour l'instant fait toi un example minimaliste (ouverture/une cellule/fermeture) - test - modifie - test - modifie - test - etc... pour être sûr que tu n'as pas 'cassé' toute l'include. il suffit d'un champs en trop, en moins dans une structure et çà casse tout. ce format de fichier (biff) est très sensible. et c'est pour çà que perso je suis passé à l'xml. mais si le code est stable je prefere le biff au xml (dans la mesure - où pour le moment - excel a gardé en tant que format principal le biff).
Image
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

Flype a écrit :dans la mesure - où pour le moment - excel a gardé en tant que format principal le biff
Ce qui sera différent avec la version 2007 !
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Exact Lionel_om !

Sinon Flype, avant de faire les fonctions pour écrire le fichier XLS, mieux vaut que je tente de le lire ! Ca me permettra de comprendre le BIFF8. Mais j'ai un petit problème. IMpossible de lire le header... donc si tu as du code, je suis intéressé. (PS : Cairo est quasi fini, je t'envoie la beta bientot)

J'ai eu aucun problème à lire le BIFF2, mais hier en quatre heures : que dalle pour le BIFF 8 !

J'ai trouvé ca mais c'est chaud à reproduire !
+ (15:32)
http://www.xlam.ch/soscq/dateiformat.htm
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Aprés de longues, longues lectures, (All, Fr, Esp, En, et je ne connais que le fr et en lol)... normalement, un fichier excel doit commencer avec 0908 en hexadécimal ! Donc si il y en a qui arrive à lire le header, merci !
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Suis assez content de moi, j'y ai travaillé trois heures hier soir...

EN fait, il y a d'abord le header OLE avant le header XLS.
J'ai essayé de traduire un fichier PHP incompréhensible mtnt, fo ke je trouve de la doc !
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Il est né le divin enfant...

J'ai réussi !
Le header OLE se lit correctement (Merci OpenOffice)...
Et j'ai réussi à lire le premier record du fichier excel :) cad BOF... plus de news demain !
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

J'ai fini de lire un fichier Excel 97 vide ! Que demander de mieux ? Ah oui, qu'il soit rempli !

Bon,j'y retrourne sinon je vais me faire engueuler !
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Flype a écrit :oula c'est un énorme travail tu sais ?
Merci, c'est vrai, mais j'adore travailler les terres plus ou moins vierges de la programmation...

Au fait, j'ai réussi à lire mon fichier XLS en entier et à en extraire les données.... Donc pour la lecture, pas de pb !

Pour l'écriture, un problème se pose : les fichiers XLS étant basé sur un format de type "Compound File Format". Il faut que je comprenne comment il fonctionne, comment en extraire les données et comment les écrire.
Répondre