2013-05-15 100 views
0

我正在使用一個Access數據庫,其中導入了從xls轉換而來的csv文件 通常這是有效的,但最近有一個文件有一些字段,導入Access導入到Access並導出到Excel時字符發生變化

例如: 破折號更改û
一開始雙引號更改ô
結束雙引號更改Ø

從我讀它有事情做與7或8位字符代碼..這是不是事端我真的明白。

我的問題是,有什麼辦法可以防止這種性格變化,或者是有什麼比我已經嘗試過的更好嗎? 或者是否有任何潛在的問題,我沒有遇到什麼似乎在我的例子下面的工作?

這是我到目前爲止已經試過,似乎工作

從原來的Excel文件另存爲Unicode文本文件(我新的東西)

ActiveWorkbook.SaveAs Filename:= _ 
"D:\NewFiles\ReportList.txt", FileFormat:=xlUnicodeText _ 
    , CreateBackup:=False 

然後導入到與數據庫以下代碼

DoCmd.TransferText acImportDelim, "ReportList Import Specification", "tbl_ReportList", "D:\NewFiles\ReportList.txt", True 

這似乎將文本正確導入數據庫。

其他人使用數據,然後將新的報告從Access導出到Excel。 將字體更改爲MS Sans Serif,並再次更改字符,但與導入時不同。 導出Excel報告後,我將字體更改爲Arial字符再次正確....至少到目前爲止。

我在過去沒有遇到過這種角色變化,而且我的解決方案似乎可行,但我不確定是否還有其他潛在問題,或者是否有任何我錯過了。我還沒有找到這個具體問題的答案。

感謝您花時間幫助解決這個問題。

+0

我已經跑到這之前,但承認這不是我的專業領域,無論是。我有一些功能,可能會有助於打開/讀取/寫入UTF8編碼的文件到內存中,但不會進入工作表/工作簿。如果您有興趣,我可以提供這些內容,但首先請嘗試[此方法](http://www.ozgrid.com/forum/showthread.php?t=154957&p=560424#post560424)轉換TXT編碼。 –

回答

0

這是我過去用來規避字符編碼問題的方法。

我懷疑這種方法也應該在Excel和Access之間工作 - 儘管Access並不是我熟悉的東西。

該子文件指定文件的全名&路徑,以及新文件名&路徑的目的地。如果您想覆蓋現有的,這些可能是相同的。

注意在幾個簡單的測試,我不能讓這個讀從Excel保存爲「統一」的文件,但它完美的逗號保存爲「製表符分隔TXT」文件和CSV文件/分離的文件也是如此。

Sub OpenAndSaveTxtUTF8() 
Dim txtFileName as String 
Dim newTxtFileName as String 

txtFileName = "D:\NewFiles\ReportList.txt" 
newTxtFileName = "D:\NewFiles\UTF8_ReportList.txt" 

WriteUTF8(ReadTextFile(txtFileName), newTxtFileName) 

End Sub 

這個子部分調用了我從代碼註釋中記錄的來源中借用的兩個函數。 WriteUTF8根據ReadTextFile的內容創建適當的UTF8文件,該文件返回完整文件內容的字符串。

Function ReadTextFile(sFileName As String) As String 
'http://www.vbaexpress.com/kb/getarticle.php?kb_id=699 
    Dim iFile As Integer 

    On Local Error Resume Next 
    ' \\ Use FreeFile to supply a file number that is not already in use 
    iFile = FreeFile 

    ' \\ ' Open file for input. 
    Open sFileName For Input As #iFile 

    ' \\ Return (Read) the whole content of the file to the function 
    ReadTextFile = Input$(LOF(iFile), iFile) 

    Close #iFile 
    On Error GoTo 0 
End Function 

此功能需要到ADODB庫的引用,或者,你可以Dim objStream As Object和代碼仍然應該爲你工作。

Function WriteUTF8(textString$, myFileOut$) 
'Modified from http://www.vbaexpress.com/forum/showthread.php?t=42375 
'David Zemens - February 12, 2013 

'Requires a reference to ADODB? 

    ' UTF8() Version 1.00 
    ' Open a "plain" text file and save it again in UTF-8 encoding 
    ' (overwriting an existing file without asking for confirmation). 
    ' 
    ' Based on a sample script from JTMar: 
    ' http://bytes.com/groups/asp/52959-save-file-utf-8-format-asp-vbscript 
    ' 
    ' Written by Rob van der Woude 
    ' http://www.robvanderwoude.com 

    Dim objStream As ADODB.Stream 

    ' Valid Charset values for ADODB.Stream 
    Const CdoBIG5 = "big5" 
    Const CdoEUC_JP = "euc-jp" 
    Const CdoEUC_KR = "euc-kr" 
    Const CdoGB2312 = "gb2312" 
    Const CdoISO_2022_JP = "iso-2022-jp" 
    Const CdoISO_2022_KR = "iso-2022-kr" 
    Const CdoISO_8859_1 = "iso-8859-1" 
    Const CdoISO_8859_2 = "iso-8859-2" 
    Const CdoISO_8859_3 = "iso-8859-3" 
    Const CdoISO_8859_4 = "iso-8859-4" 
    Const CdoISO_8859_5 = "iso-8859-5" 
    Const CdoISO_8859_6 = "iso-8859-6" 
    Const CdoISO_8859_7 = "iso-8859-7" 
    Const CdoISO_8859_8 = "iso-8859-8" 
    Const CdoISO_8859_9 = "iso-8859-9" 
    Const cdoKOI8_R = "koi8-r" 
    Const cdoShift_JIS = "shift-jis" 
    Const CdoUS_ASCII = "us-ascii" 
    Const CdoUTF_7 = "utf-7" 
    Const CdoUTF_8 = "utf-8" 

    ' ADODB.Stream file I/O constants 
    Const adTypeBinary = 1 
    Const adTypeText = 2 
    Const adSaveCreateNotExist = 1 
    Const adSaveCreateOverWrite = 2 

    On Error Resume Next 

    Set objStream = CreateObject("ADODB.Stream") 
    objStream.Open 
    objStream.Type = adTypeText 
    objStream.Position = 0 
    objStream.Charset = CdoUTF_8 


'We are passing a string to write to file, so omit the following line 
' objStream.LoadFromFile myFileIn 

'And instead of using LoadFromFile we are writing directly from the COPIED 
' text from the unsaved/temp instance of Notepad.exe 
objStream.WriteText textString, 1 

    objStream.SaveToFile myFileOut, adSaveCreateOverWrite 
    objStream.Close 
    Set objStream = Nothing 

    If Err Then 
     WriteUTF8 = False 
    Else 
     WriteUTF8 = True 
    End If 

    On Error GoTo 0 
End Function