长文本(> 255 个字符)在 MS Access 2013 中导入和添加到现有表时被截断
Posted
技术标签:
【中文标题】长文本(> 255 个字符)在 MS Access 2013 中导入和添加到现有表时被截断【英文标题】:Long text (> 255 chars) truncated while importing and adding to existing table in MS Access 2013 【发布时间】:2016-02-18 17:56:13 【问题描述】:我正在尝试使用以下 VBA 代码导入 Excel 电子表格。在引入之前,我还要删除表格的当前内容。
DoCmd.RunSQL ("DELETE * FROM REBATE_PROG")
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "REBATE_PROG", filepath, True
rebate_prog 表已经有定义为长文本的字段(根据我的理解,这是旧的备注字段),应该能够存储 > 255 个字符。
Access 是否有理由截断内容?
我尝试过的一些事情,没有成功:
按要截断的字段的长度对导入文件进行降序排序 - 因为如果 excel 只查看几行顶部,它将作为长文本导入。 尝试将表格属性中设计视图下字段的“文本格式”更新为纯文本格式,但由于某种原因,Access 不允许我进行更改。有没有一种方法可以在不截断字段的情况下导入 excel 电子表格?
【问题讨论】:
Truncated Data when Importing from Excel to an Access Memo Field的可能重复 【参考方案1】:这是我通常针对此类数据类型问题采取的快速技巧。 (假设你的 Excel 文件不是怪物):
在 Excel 中,首先在开头添加一个空列 (A),然后选择整个工作表(单击左上角),然后 CTRL-C
在 Access 中,使用“表格”按钮创建一个新表格。单击左上角以选择所有内容(应该只有一个单元格),然后按 CTRL-V 您的数据在那里,并且您的列已创建。 检查长文本所在的列,它可能是短文本并且您的数据被截断。进入表格的设计模式并将字段更改为 LongText/Memo,将格式更改为富文本(确保在 254 个字符后不会隐藏)并保存表格。
从表中删除所有行
重复从 Excel 复制/粘贴操作到您的表格
您的文本不应再被截断,您可以使用此表或其结构副本在 APPEND 模式下进行进一步的 VBA 导入
【讨论】:
我尝试执行上述步骤..我无法将格式类型更改为富文本..没有它,建议的方式似乎不起作用。当我手动复制 excel 数据并将其粘贴到表中时 - 所有信息都按预期进入(未截断)。但是,当我尝试使用最初问题中提到的 VBA 代码自动执行导入过程时 - 数据会像以前一样被截断。关于下一步我可以尝试什么的任何建议?如果需要,我也可以更新 VBA 代码。如果这样可以解决截断问题。 好的,所以通过该步骤,我们确定问题不在 Access 中,而是在 _TransferSpreadsheet _ 命令中。您可以做一些事情:在您的 Excel 工作表中,在 第一行 上,对于包含长文本的列,检查单元格是否包含长文本(>255 个字符)。如果没有,请为每个长文本列添加一个带有长文本的新第一行。这样,进口商将知道此列包含长文本,并且不会将其视为文件其余部分的短文本,我怀疑这是您问题的根本原因 谢谢托马斯。我实际上找到了一分钟前刚刚实施的替代方案。看起来很有希望。我已经用我为该问题实施的解决方案更新了该问题。【参考方案2】:找到解决此问题的方法。可能还有其他解决方案,但这个似乎对我最有效。以下是我所做的一步一步:
-
手动创建 Access 表:我在 access 2013 中手动创建表结构并为每个字段定义每种数据类型。在我希望导入 >255 个字符的字段上,我将此字段数据类型设置为“长文本”,并将格式选择为“富文本”。
注意:我为此表创建的结构与我打算导入的文件中的结构完全相同。
-
按字符长度对导入文件进行排序:接下来,我使用
LEN()
函数在导入文件中添加了一个新字段,即LEN(<Cell in the long text field>)
。然后使用该字段对所有记录进行降序排序并保存文件。我必须这样做,因为 Access 在导入时会查看几行,以确定需要从列中导入多少数据(我在通过几个论坛后了解到这一点)。
注意:您还可以创建一个 VBA 代码,在导入之前为您按降序排序,但我还没有执行。如果你这样做,请在这里分享代码!
-
导入!:最后,使用我在下面提供的代码截断我们手动创建的表格,并将 excel 中的内容插入表格中。
DoCmd.RunSQL ("DELETE * FROM REBATE_PROG")
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "REBATE_PROG", filepath, True
【讨论】:
【参考方案3】:在我的例子中,长文本从 Excel 导入到 Access 2016,但无法完全看到。
只需从表格中的 Format 属性中删除“@”,就可以在表格中看到完整的字段。
同样,删除显示长文本的表单文本框上的“@”,可以在表单上看到完整的字段。
【讨论】:
【参考方案4】:这就是我所做的。我隔离了长文本字段,以便我可以使用更新而不是附加来添加它。
所以在我的原始通道中,我将链接的 Excel 表中的数据附加到我的访问表中。这不起作用,因为它截断了长文本。所以我所做的是从追加查询中删除长文本字段,并为所有其他字段运行追加
现在我的新记录的长文本字段为空,我现有的记录长文本。 (我需要这样做,因为长文本可能已经改变,如果当前的长文本与现有的长文本不匹配,我需要稍后在加载路由中进行更新。(这就是我找到这个的方式))
所以,现在我可以对 Long Text 字段为 Null 的记录进行更新,而对具有 Long Text 的记录保持不变。这将输入整个长文本。
稍后,当我对已更改的文本进行第二次更新时,数据库将看到实际更改,而不是由于 Append 截断而导致的错误更改。
更新很好。追加不好
【讨论】:
【参考方案5】:这个问题有一个非常简单易行的解决方案。例如,工作表 #1 中 A 列的某些行包含短文本,而同一列的某些行包含长文本。将工作表 #1 复制为工作表 #2。
在工作表 #1 上,删除 A 列的长文本行并仅保留短文本行。
在工作表 #2 上,删除 A 列的短文本行并仅保留长文本行。
现在对工作表 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 多次测试,并且效果很好。诀窍是在两个工作表中划分具有混合短文本和长文本行的列。 所有其他程序员都失败了,因为他们中的大多数人忽略了 VBA 无法处理包含短文本和长文本的混合列这一事实。
【讨论】:
以上是关于长文本(> 255 个字符)在 MS Access 2013 中导入和添加到现有表时被截断的主要内容,如果未能解决你的问题,请参考以下文章
Access 报告文本框仅显示 255 个字符的较长查询结果
有啥方法可以在 DAO 和 MS Access 中使用长文本(备忘录)参数?