Can I export excel data with UTF-8 without BOM?

后端 未结 6 1353
慢半拍i
慢半拍i 2020-12-01 04:00

I export Microsoft Excel data by Excel Macro(VBScript). Because file is lua script, I export it as UTF-8. The only way I can make UTF-8 in Excel is using adodb.stream like t

6条回答
  •  春和景丽
    2020-12-01 04:28

    Uf you prefer native T-SQL instead of external code

    DECLARE @FILE_NAME              VARCHAR(255)    = 'd:\utils\test.xml'       --drive:\path\filename\
    DECLARE @FILE_DATA              VARCHAR(MAX)    = 'test'            --binary as varchar(max)
    
    DECLARE @FILE_NAME_TO           VARCHAR(255)                        --Temp name for text stream
    DECLARE @FSO_ID_TXTSTRM         INT                                 --Text Stream
    DECLARE @FSO_ID_BINSTRM         INT                                 --Binary Stream
    DECLARE @RC                     INT 
    
    EXEC @RC = sp_OACreate 'ADODB.Stream',  @FSO_ID_TXTSTRM OUTPUT
    EXEC @RC = sp_OASetProperty             @FSO_ID_TXTSTRM,    'Type',             2                           --1 = binary, 2 = text
    EXEC @RC = sp_OASetProperty             @FSO_ID_TXTSTRM,    'Mode',             3                           --0 = not set, 1 read, 2 write, 3 read/write
    EXEC @RC = sp_OASetProperty             @FSO_ID_TXTSTRM,    'Charset',          'UTF-8'                     --'ISO-8859-1'
    EXEC @RC = sp_OASetProperty             @FSO_ID_TXTSTRM,    'LineSeparator',    'adLF'
    EXEC @RC = sp_OAMethod                  @FSO_ID_TXTSTRM,    'Open'  
    EXEC @RC = sp_OAMethod                  @FSO_ID_TXTSTRM,    'WriteText',        NULL,       @FILE_DATA      --text method
    
    --Create binary stream
    EXEC @RC = sp_OACreate 'ADODB.Stream',  @FSO_ID_BINSTRM OUTPUT
    EXEC @RC = sp_OASetProperty             @FSO_ID_BINSTRM,    'Type',             1                           --1 = binary, 2 = text
    EXEC @RC = sp_OAMethod                  @FSO_ID_BINSTRM,    'Open'
    EXEC @RC = sp_OASetProperty             @FSO_ID_BINSTRM,    'Mode',             3                           --0 = not set, 1 read, 2 write, 3 read/write    
    
    --Move 3 positions forward in text stream (BOM is first 3 positions)
    EXEC @RC = sp_OASetProperty             @FSO_ID_TXTSTRM,    'Position',         3
    
    --Copy text stream to binary stream
    EXEC @RC = sp_OAMethod                  @FSO_ID_TXTSTRM,    'CopyTo',           NULL,       @FSO_ID_BINSTRM
    
    --Commit data and close text stream
    EXEC @RC = sp_OAMethod                  @FSO_ID_TXTSTRM,    'Flush'
    EXEC @RC = sp_OAMethod                  @FSO_ID_TXTSTRM,    'Close'
    EXEC @RC = sp_OADestroy                 @FSO_ID_TXTSTRM
    
    --Save binary stream to file and close
    EXEC @RC = sp_OAMethod                  @FSO_ID_BINSTRM,    'SaveToFile',       NULL,       @FILE_NAME, 2   --1 = notexist 2 = overwrite
    EXEC @RC = sp_OAMethod                  @FSO_ID_BINSTRM,    'Close'
    EXEC @RC = sp_OADestroy                 @FSO_ID_BINSTRM
    

提交回复
热议问题