在 MS Access 2013 中导入和添加现有 table 时,长文本(> 255 个字符)被截断
Long text (> 255 chars) truncated while importing and adding to existing table in MS Access 2013
我正在尝试使用以下 VBA 代码导入 excel 电子表格。在引入它之前,我还删除了 table.
的当前内容
DoCmd.RunSQL ("DELETE * FROM REBATE_PROG")
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "REBATE_PROG", filepath, True
rebate_prog table 已经将字段定义为长文本(根据我的理解,这是旧的备忘录字段)应该能够存储 > 255 个字符。
Access 截断内容是否有原因?
我尝试过的一些事情,但没有成功:
- 按被截断的字段的长度降序对导入文件进行排序 - 因为如果 excel 仅查看顶部的几行,它将作为长文本导入。
- 尝试将 table 属性中设计视图下字段的 "Text Format" 更新为普通格式的富文本,但出于某种原因,Access 不允许我进行更改。
有什么方法可以导入 excel 电子表格而无需截断字段?
这是我通常用来解决这类数据类型问题的快速技巧。
(假设你的 Excel 文件不是怪物):
在Excel中,首先在开头添加一个空列(A),其次select你的整个sheet(点击左上角),然后然后 CTRL-C
在 Access 中,使用 "table" 按钮创建一个新的 table。单击左上角 select 所有内容(应该只有一个单元格),然后按 CTRL-V
您的数据就在那里,并且您的列已创建。
检查长文本所在的列,它可能是短文本并且您的数据被截断了。在 table 上进入设计模式,将字段更改为 LongText/Memo,将格式更改为富文本格式(确保它不会在 254 个字符后隐藏)并保存 table。
从 table
中删除所有行
重复从 Excel 到 table
的 copy/paste 操作
您的文本不应再被截断,您可以使用此 table 或其结构副本在 APPEND 模式下进一步 VBA 导入
找到解决此问题的方法。可能还有其他解决方案,但这个似乎对我最有效。以下是我所做的一步一步:
- 手动创建 Access Table: 我在 Access 2013 中手动创建了 table 结构并为每个字段定义了每种数据类型。在我想要导入 >255 个字符的字段上,我将此字段数据类型设置为 "Long text" 并将格式选择为 "Rich text".
注意:我为此 table 创建的结构与我打算导入的文件中的结构完全相同。
- 按字符长度对导入文件进行排序:接下来,我使用
LEN()
函数作为 LEN(<Cell in the long text field>)
在导入文件中添加了一个新字段。然后使用该字段将所有记录降序排列并保存文件。我必须这样做,因为 Access 在导入时会查看顶部的几行以确定需要从该列导入多少数据(我在浏览了几个论坛后了解到这一点)。
注意:您还可以创建一个 VBA 代码,在导入之前为您按降序排序,但我还没有执行它。如果你这样做,请在此处分享代码!
- 导入!:最后,使用我下面提供的代码截断我们手动创建的table并将excel中的内容插入table.
DoCmd.RunSQL ("DELETE * FROM REBATE_PROG")
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "REBATE_PROG", filepath, True
在我的例子中,长文本是从 Excel 导入到 Access 2016,但无法完全看到。
只需从 table 中的格式 属性 中删除“@”,就可以在 table 中看到完整的字段。
同样,删除显示长文本的表单文本框上的“@”,可以在表单上看到完整的字段。
这是我所做的。我隔离了长文本字段,以便我可以使用更新而不是追加来添加它。
所以在我原来的传递中,我将来自链接 Excel table 的数据附加到我的访问 table 中。这没有用,因为它截断了长文本。所以我所做的是从追加查询中删除长文本字段,运行所有其他字段的追加
现在我的新记录的那个长文本字段为空,而我现有的记录有长文本。 (我需要这样做是因为长文本可能已经改变,如果当前的长文本与现有的长文本不匹配,我需要稍后在加载路由中进行更新。(这就是我发现的))
所以,现在我可以对长文本字段为空的记录进行更新,并保持具有长文本的记录不变。这样就进入了整个长文本。
稍后,当我对已更改的文本进行第二次更新时,数据库将看到实际更改,而不是由于追加截断而导致的错误更改。
更新很好。追加不好
这个问题有一个非常简单易行的解决方案。例如,工作表 #1 中 A 列的某些行包含短文本,而同一列的某些行包含长文本。将工作表 #1 复制为工作表 #2。
在工作表 #1 上,删除 A 列的 long-text 行,仅保留 short-text 行。
在工作表 #2 上,删除 A 列的 short-text 行,仅保留 long-text 行。
现在对工作表 1 使用传输电子表格命令,然后对工作表 #2 使用。
Call DoCmd.TransferSpreadsheet( _
acImport, _
acSpreadsheetTypeExcel12Xml, _
strTableName, _
strFullPathOfWorkbook, _
True, _
"WorkSheet_1!A1:Z1000)
Call DoCmd.TransferSpreadsheet( _
acImport, _
acSpreadsheetTypeExcel12Xml, _
strTableName, _
strFullPathOfWorkbook, _
True, _
"WorkSheet_2!A1:Z1000)
我已经对该解决方案进行了 100 多次测试,并且效果很好。诀窍是在两个工作表中划分具有混合 short-text 和 long-text 行的列。
所有其他程序员都失败了,因为他们中的大多数人都忽略了 VBA 无法处理包含短文本和长文本的混合列这一事实。
我正在尝试使用以下 VBA 代码导入 excel 电子表格。在引入它之前,我还删除了 table.
的当前内容DoCmd.RunSQL ("DELETE * FROM REBATE_PROG")
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "REBATE_PROG", filepath, True
rebate_prog table 已经将字段定义为长文本(根据我的理解,这是旧的备忘录字段)应该能够存储 > 255 个字符。
Access 截断内容是否有原因?
我尝试过的一些事情,但没有成功:
- 按被截断的字段的长度降序对导入文件进行排序 - 因为如果 excel 仅查看顶部的几行,它将作为长文本导入。
- 尝试将 table 属性中设计视图下字段的 "Text Format" 更新为普通格式的富文本,但出于某种原因,Access 不允许我进行更改。
有什么方法可以导入 excel 电子表格而无需截断字段?
这是我通常用来解决这类数据类型问题的快速技巧。 (假设你的 Excel 文件不是怪物):
在Excel中,首先在开头添加一个空列(A),其次select你的整个sheet(点击左上角),然后然后 CTRL-C
在 Access 中,使用 "table" 按钮创建一个新的 table。单击左上角 select 所有内容(应该只有一个单元格),然后按 CTRL-V 您的数据就在那里,并且您的列已创建。 检查长文本所在的列,它可能是短文本并且您的数据被截断了。在 table 上进入设计模式,将字段更改为 LongText/Memo,将格式更改为富文本格式(确保它不会在 254 个字符后隐藏)并保存 table。
从 table
中删除所有行
重复从 Excel 到 table
的 copy/paste 操作
您的文本不应再被截断,您可以使用此 table 或其结构副本在 APPEND 模式下进一步 VBA 导入
找到解决此问题的方法。可能还有其他解决方案,但这个似乎对我最有效。以下是我所做的一步一步:
- 手动创建 Access Table: 我在 Access 2013 中手动创建了 table 结构并为每个字段定义了每种数据类型。在我想要导入 >255 个字符的字段上,我将此字段数据类型设置为 "Long text" 并将格式选择为 "Rich text".
注意:我为此 table 创建的结构与我打算导入的文件中的结构完全相同。
- 按字符长度对导入文件进行排序:接下来,我使用
LEN()
函数作为LEN(<Cell in the long text field>)
在导入文件中添加了一个新字段。然后使用该字段将所有记录降序排列并保存文件。我必须这样做,因为 Access 在导入时会查看顶部的几行以确定需要从该列导入多少数据(我在浏览了几个论坛后了解到这一点)。
注意:您还可以创建一个 VBA 代码,在导入之前为您按降序排序,但我还没有执行它。如果你这样做,请在此处分享代码!
- 导入!:最后,使用我下面提供的代码截断我们手动创建的table并将excel中的内容插入table.
DoCmd.RunSQL ("DELETE * FROM REBATE_PROG")
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "REBATE_PROG", filepath, True
在我的例子中,长文本是从 Excel 导入到 Access 2016,但无法完全看到。
只需从 table 中的格式 属性 中删除“@”,就可以在 table 中看到完整的字段。
同样,删除显示长文本的表单文本框上的“@”,可以在表单上看到完整的字段。
这是我所做的。我隔离了长文本字段,以便我可以使用更新而不是追加来添加它。
所以在我原来的传递中,我将来自链接 Excel table 的数据附加到我的访问 table 中。这没有用,因为它截断了长文本。所以我所做的是从追加查询中删除长文本字段,运行所有其他字段的追加
现在我的新记录的那个长文本字段为空,而我现有的记录有长文本。 (我需要这样做是因为长文本可能已经改变,如果当前的长文本与现有的长文本不匹配,我需要稍后在加载路由中进行更新。(这就是我发现的))
所以,现在我可以对长文本字段为空的记录进行更新,并保持具有长文本的记录不变。这样就进入了整个长文本。
稍后,当我对已更改的文本进行第二次更新时,数据库将看到实际更改,而不是由于追加截断而导致的错误更改。
更新很好。追加不好
这个问题有一个非常简单易行的解决方案。例如,工作表 #1 中 A 列的某些行包含短文本,而同一列的某些行包含长文本。将工作表 #1 复制为工作表 #2。
在工作表 #1 上,删除 A 列的 long-text 行,仅保留 short-text 行。
在工作表 #2 上,删除 A 列的 short-text 行,仅保留 long-text 行。
现在对工作表 1 使用传输电子表格命令,然后对工作表 #2 使用。
Call DoCmd.TransferSpreadsheet( _
acImport, _
acSpreadsheetTypeExcel12Xml, _
strTableName, _
strFullPathOfWorkbook, _
True, _
"WorkSheet_1!A1:Z1000)
Call DoCmd.TransferSpreadsheet( _
acImport, _
acSpreadsheetTypeExcel12Xml, _
strTableName, _
strFullPathOfWorkbook, _
True, _
"WorkSheet_2!A1:Z1000)
我已经对该解决方案进行了 100 多次测试,并且效果很好。诀窍是在两个工作表中划分具有混合 short-text 和 long-text 行的列。 所有其他程序员都失败了,因为他们中的大多数人都忽略了 VBA 无法处理包含短文本和长文本的混合列这一事实。