如何在记事本或VBA中创建dbf文件和定义编码
什么是如何在记事本或VBA中创建dbf文件和定义编码,vba,dbf,pdb-files,Vba,Dbf,Pdb Files,什么是DBF4(dBase IV)(*.dbf)file基本格式?如何在与记事本相同的word编辑器中通过键入创建这些文件?(更新:或excel VBA?) 其格式规范是什么: 分隔符(与:、或选项卡等相同) 分隔符(可能与上面相同!)(如果这两个不是同义词) 行尾字符:(与vbCrLf相同) 定义列(字段)的标题 编码的代码页:(同:Unicode-1256等) 和其他人 请提供一种创建此DB文件格式的算法,该算法使我们能够通过创建文本文件的VBA方法轻松创建相同的文件。 (更新或使用内置
DBF4(dBase IV)(*.dbf)
file基本格式?如何在与记事本相同的word编辑器中通过键入创建这些文件?(更新:或excel VBA?)
其格式规范是什么:
分隔符
(与:、
或选项卡
等相同)
分隔符
(可能与上面相同!)(如果这两个不是同义词)
行尾
字符:(与vbCrLf
相同)
- 定义列(字段)的标题
编码的代码页
:(同:Unicode-1256
等)
- 和其他人
请提供一种创建此DB
文件格式的算法,该算法使我们能够通过创建文本文件的VBA
方法轻松创建相同的文件。
(更新或使用内置VBA或其引用方法。)
我使用下面的方法创建文本文件
Sub CsvExportRange(rngRange As Object, strFileName As String, strCharset, strSeparator As String, strRowEnd As String, NVC As Boolean) 'NVC: _
Null Value Control (If cell contain Null value, suppose reached end of range), d: delimiter
Dim rngRow As Range
Dim objStream As Object
Dim i, lngFR, lngLR As Long 'lngFR: First Row, lngLR: Last Row
lngFR = rngRange.SpecialCells(xlCellTypeVisible).Rows(1).row - rngRange.Rows(1).row + 1
lngLR = rngRange.End(xlDown).row - rngRange.Rows(1).row + 1
Set objStream = CreateObject("ADODB.Stream")
objStream.Type = 2
objStream.Charset = strCharset
objStream.Open
For i = lngFR To lngLR
If Not (rngRange.Rows(i).EntireRow.Hidden) Then
If IIf(NVC, (Cells(i + rngRange.Rows(1).row - 1, _
rngRange.SpecialCells(xlCellTypeVisible).Columns(1).column).Value = vbNullString), False) Then Exit For
objStream.WriteText CsvFormatRow(rngRange.Rows(i), strSeparator, strRowEnd)
End If
Next i
objStream.SaveToFile strFileName, 2
objStream.Close
End Sub
Function CsvFormatRow(rngRow As Variant, strSeparator As String, strRowEnd As String) As String
Dim arrCsvRow() As String
ReDim arrCsvRow(rngRow.SpecialCells(xlCellTypeVisible).Cells.Count - 1)
Dim rngCell As Range
Dim lngIndex As Long
lngIndex = 0
For Each rngCell In rngRow.SpecialCells(xlCellTypeVisible).Cells
arrCsvRow(lngIndex) = CsvFormatString(rngCell.Value, strSeparator)
lngIndex = lngIndex + 1
Next rngCell
CsvFormatRow = Join(arrCsvRow, strSeparator) & strRowEnd
End Function
Function CsvFormatString(strRaw, strSeparator As String) As String
Dim boolNeedsDelimiting As Boolean
Dim strDelimiter, strDelimiterEscaped As String
strDelimiter = """"
strDelimiterEscaped = strDelimiter & strDelimiter
boolNeedsDelimiting = InStr(1, strRaw, strDelimiter) > 0 _
Or InStr(1, strRaw, chr(10)) > 0 _
Or InStr(1, strRaw, strSeparator) > 0
CsvFormatString = strRaw
If boolNeedsDelimiting Then
CsvFormatString = strDelimiter & _
Replace(strRaw, strDelimiter, strDelimiterEscaped) & _
strDelimiter
End If
End Function
(被遗忘的来源)
因为我做到了这一点:我应该从我的ExcelRange
手动创建一个dbf
文件!经过搜索发现的网络资源
更新:
如何声明DBF的编码
关于需要的编码,在这个问题上相当多的是常见的是伊朗系统编码
如何将数据以合适的编码存储在DB表记录中作为伊朗系统?我们很高兴。。。。哈哈
此测试代码从excel工作表中的数据创建dbf文件
创建一个表并插入一条记录
Sub dbfTest()
' NOTE: put this test data at top of worksheet (A1:F2)
' Name Date Code Date2 Description Amount
' frank 11/12/2017 234.00 11/20/2018 paint $1.34
' ref: microsoft activex data objects
Dim path As String
Dim fileName As String
filePath = "C:\database\"
fileName = "test"
Dim dc As Range
Dim typ As String
Dim fieldName As String
Dim createSql As String
createSql = "create table " + fileName + " (" ' the create table query produces the file in directory
Dim a As Variant
For Each dc In Range("a1:e1")
fieldName = dc.Value
a = dc.offset(1).Value
Select Case VarType(a)
Case vbString: typ = "varchar(100)"
Case vbBoolean: typ = "varchar(10)"
Case vbInteger: typ = "int"
Case vbLong: typ = "Double"
Case vbDate: typ = "TimeStamp"
Case Else: typ = "varchar(5)" ' default for undefined types
End Select
createSql = createSql + " [" + fieldName + "]" + " " + typ + ","
Next dc
createSql = Left(createSql, Len(createSql) - 1) + ")"
Debug.Print createSql
Dim conn As ADODB.connection
Set conn = CreateObject("ADODB.Connection")
conn.Open "DRIVER={Microsoft dBase Driver (*.dbf)};" & "DBQ=" & filePath ' both work
' conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & filePath & ";Extended Properties=dBASE IV"
Dim cmd As ADODB.Command
Set cmd = CreateObject("ADODB.Command")
cmd.ActiveConnection = conn
cmd.CommandText = createSql
cmd.Execute
Dim insertSql As String
insertSql = "insert into " + fileName + " values("
For Each dc In Range("a2:e2")
insertSql = insertSql + "'" + CStr(dc.Value) + "',"
Next dc
insertSql = Left(insertSql, Len(insertSql) - 1) + ")"
Debug.Print insertSql
cmd.CommandText = insertSql
cmd.Execute
conn.Close
Set conn = Nothing
End Sub
我的研究已经结束。伊朗系统编码实际上是ascii,而不是unicode。它使用ascii值来表示一些波斯字母表
从unicode转换为伊朗系统编码的问题是,任何字母的书写方式都完全不同,这取决于它在单词中的位置。大多数字母都有“孤立”、“首字母”、“中间字母”和“末字母”形式
就像类固醇上的上下病例。。。哈哈
参考:
所以,在存储到数据库之前,需要额外的过程将excel中的unicode文本转换为等效的伊朗系统编码字符串
代码创建一个带有一个文本字段的表,并存储3条记录
Sub dbfTestWork()
' ref: microsoft activex data objects
Dim filePath As String
Dim fileName As String
filePath = "C:\database\"
fileName = "test"
Dim conn As ADODB.Connection
Set conn = CreateObject("ADODB.Connection")
conn.Open "Driver={Microsoft dBase Driver (*.dbf)};Dbq=" + filePath + ";"
'conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & filePath & ";Extended Properties=dBASE IV;"
Dim fil As String
fil = filePath & fileName & ".dbf"
If Not Dir(fil, vbDirectory) = vbNullString Then Kill fil ' delete file if it exists
Dim cmd As ADODB.Command
Set cmd = CreateObject("ADODB.Command")
cmd.ActiveConnection = conn
cmd.CommandText = "create table test ([testTextData] char(20))"
cmd.Execute
Dim nFileNum As Integer
nFileNum = FreeFile ' Get an available file number from the system
Open filePath & fileName & ".dbf" For Binary Lock Read Write As #nFileNum ' Open the file in binary mode. Locks are optional
Put #nFileNum, 30, CByte(1) ' set language driver id (LDID) 0x01 = ascii encoding
Close #nFileNum
' Debug.Print Range("e2").Value
Dim aaa As String
aaa = StrConv(Range("e2").Value, vbUnicode)
' Debug.Print aaa
Dim cmdStr As String
cmdStr = "insert into test values ('"
Dim ccc As Variant
For Each ccc In Array("ac", "92", "9e", "20", "93", "a1", "fe", "a4") ' one of these two should store
cmdStr = cmdStr & Chr(CDec("&h" & ccc)) ' "good morning" in persian
Next ccc
cmdStr = cmdStr & "');"
cmd.CommandText = cmdStr
cmd.Execute
cmdStr = "insert into test values ('"
For Each ccc In Array("a4", "fe", "a1", "93", "20", "9e", "92", "ac")
cmdStr = cmdStr & Chr(CDec("&h" & ccc))
Next ccc
cmdStr = cmdStr & "');"
cmd.CommandText = cmdStr
cmd.Execute
cmd.CommandText = "insert into test values ('abc123');"
cmd.Execute
conn.Close
Set conn = Nothing
End Sub
'
记事本只能将文件保存为纯文本。为什么要使用记事本创建DBF文件??这和VBA有什么关系?你在网上研究过你的问题吗?你没有。。。。我做了一个搜索,第一个点击的是格式的描述。我用记事本创建什么是因为:我在导出ExcelRange
到DBF
阶段遇到了一个问题,不希望找到一个用于装入导出器宏的代码。因此,我正在尝试找到内部DBF
的结构和算法,以便使用VBA
宏手动从我的excelRange
创建此文件。如果使用记事本+,则可以切换到十六进制显示。这将向您显示文件的真实结构。。。。或者下载这个,用它来查看文件的内容,有这个。。。你的回答简短、漂亮、清晰、有用;这正是需要解决的问题@jsotola@:我正在开发您的代码,准备发布,并将在这里向您展示它的上传路径。请留下它作为答案。@jsotola@:在上面的代码中,如何将代码页
或编码
定义为Unicode
?正在检查it@jsotola@:我需要Unicode编码的记录值(CStr(dc.Value)
)。哪种数据类型可以为此字段定义Unicode?例如,我尝试了typ=“nvarchar(100)”
,但nvarchar
未被批准,并返回错误。@jsotola@:通过上述例程,我能够以DBF格式导出Excel。但这并不完整。我需要在目标DBF中定义编码。我到达了编码表以获得合适的编码,但如何定义DBF编码?使用aaa=StrConv(Range(“e2”).Value,vbUnicode)
?在上面值得一提的答案中,使用reference和CDec()
,我将为相应的等效Unicode和伊朗系统ASCII代码创建map
数组,然后使用write-property函数转换这两个文本字符串,使用上面映射的字典和字符识别。然后将结果发送给您(当我成功时)。非常感谢,以上讨论的结果准备好呈现,我将准备好的程序发送给您。说明在伊朗国家,有一项政府每月定期为分包商提供的任务,即准备保险清单报告。我为伊朗政府保险清单编制了清单生成器,对其指定的字符代码进行解码,与伊朗系统编码相同,字符ASCW代码中存在一些差异。我把我最后的一些相关问题编入了你的指南,作为答案发表。谢谢你,我欠你的。