Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
导入到Access并导出到Excel时,字符会发生更改_Excel_Vba_Ms Access - Fatal编程技术网

导入到Access并导出到Excel时,字符会发生更改

导入到Access并导出到Excel时,字符会发生更改,excel,vba,ms-access,Excel,Vba,Ms Access,我正在一个Access数据库中导入从xls转换的csv文件 通常这是可行的,但最近一个文件有一些字段,这些字段中的字符在导入Access后会发生变化 例如: 破折号变为 起始双引号更改为“ 结束双引号更改为ö 据我所知,它与7位或8位字符代码有关。。这不是我真正理解的 我的问题是,有没有办法阻止这种性格的改变,或者有什么比我已经尝试过的更好的方法? 或者,在我下面的例子中,是否有任何潜在的问题是我没有遇到的 以下是我迄今为止尝试过的似乎有效的方法 从原始Excel文件另存为unicode文本文

我正在一个Access数据库中导入从xls转换的csv文件 通常这是可行的,但最近一个文件有一些字段,这些字段中的字符在导入Access后会发生变化

例如: 破折号变为
起始双引号更改为“
结束双引号更改为ö

据我所知,它与7位或8位字符代码有关。。这不是我真正理解的

我的问题是,有没有办法阻止这种性格的改变,或者有什么比我已经尝试过的更好的方法? 或者,在我下面的例子中,是否有任何潜在的问题是我没有遇到的

以下是我迄今为止尝试过的似乎有效的方法

从原始Excel文件另存为unicode文本文件(对我来说是新的)

然后使用以下代码导入数据库

    DoCmd.TransferText acImportDelim, "ReportList  Import Specification", "tbl_ReportList", "D:\NewFiles\ReportList.txt", True 
这似乎可以正确地将文本导入数据库

其他人处理数据,然后将新报告从Access导出到Excel。 这会将字体更改为MS Sans Serif,并再次更改字符,但更改与导入时不同。 导出Excel报告后,我将字体更改为Arial,字符再次正确。。。。至少到目前为止

我过去没有遇到过这种性格变化,我的解决方案似乎有效,但我不确定是否还有其他潜在的问题,或者我是否遗漏了什么。我还没有找到这个具体问题的答案


感谢您花时间来帮助解决这个问题。

这里有一个方法,我过去曾使用过它来规避字符编码问题

我怀疑这种方法也应该在Excel和Access之间工作——尽管Access并不是我真正熟悉的东西

此子项指定文件的全名和路径,以及新文件名和路径的目标。如果您要覆盖现有的,这些可能是相同的

注意在一些简单的测试中,我无法从Excel中读取保存为“Unicode”的文件,但它在保存为“制表符分隔的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
这个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

我以前也遇到过这个问题,但不可否认,这也不是我的专业领域。我有一些函数,可能有助于在内存中打开/读取/写入UTF8编码的文件,但不能在工作表/工作簿中。如果您感兴趣,我可以提供这些,但首先,请尝试转换TXT编码。
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