如何解析Excel中的“剪切和粘贴”

时间:2009-01-21 15:06:04

标签: c# asp.net excel

对于Web应用程序的一部分,用户需要从电子表格中导入一些数据。例如名称和电子邮件地址列表。目前,我们要求用户浏览并上传CSV文件。

不幸的是,这并不总是可行的,因为各种企业IT系统只允许用户从文档管理系统访问文件,他们没有权限将这些文件保存到本地驱动器或网络共享。

我们的解决方案是允许用户将整个工作表(CSV)剪切并粘贴到文本区域并提交。在执行此操作时,您将获得一个很好的制表符分隔的数据列表,可以轻松解析如下。

Lorem   ipsum   dolor   sit amet
consectetur adipiscing  elit    Vivamus fermentum
Vivamus et  diam    eu  eros
egestas rutrum  Morbi   id  neque
id  enim    molestie    tincidunt   Nullam

不幸的是,各种细胞都会产生意想不到的结果。在下面的集合中,你可以看到一个单词prerium,一个带有Suspendisse字样的标签和一个单词sollicitudin中的换行符。

bibendum    ante    molestie    lectus  Sed
pret"ium    "Susp   endisse"    "sollic
itudin" nisi    at
urna    Sed sit amet    odio
eu  neque   egestas tincidunt   Nunc
metus   Curabitur   at  nibh    Nulla

在这种情况下,我不能仅仅在选项卡和换行符上拆分而没有更多增强机制来处理实际数据中的选项卡,引号和换行符。

有没有人知道任何能够可靠处理此问题的代码?或者即使excel和像这样的剪贴板可以依赖产生一致的结果?

我使用C#在Asp.net 3.5中工作。 用户excel版本可能会有所不同,但应始终为Windows 2000 / XP / Vista和IE 6/7。

5 个答案:

答案 0 :(得分:1)

这看起来像是一个“分隔值”列表,所以基本上与CSV相同,TAB作为字段分隔符,换行符作行分隔符。您可以使用CSV Reader library from CodeProject进行尝试,它应该处理不同的分隔符,而不仅仅是逗号。

答案 1 :(得分:0)

尝试在System.Windows.Forms.Clipboard members

中找到有用的内容

答案 2 :(得分:0)

我见过一个粘贴csv文件的解决方案,包括从IDataObject中的剪贴板中获取数据,然后使用带有IDataObject.GetData(“csv”)的StreamReader将csv的每一行读入数据对象

这可能比将csv粘贴到文本框然后将其塞进另一个数据对象中更可靠。

抱歉,我没有示例代码,当我有时间尝试时,我会尝试编辑它。

答案 3 :(得分:0)

通过快速检查,可以创建包含选项卡的Excel单元格值(尝试="abc"&CHAR(9)&"def"并将单元格复制到html文本区域)和一个或多个引号(例如="this has""one quote") 。我看不出任何完全万无一失的方式来确定你得到的东西。

问题在于,您无法真正控制Excel(作为源)与浏览器中的文本区域(作为粘贴目标)之间的交互。我甚至不确定不同浏览器的结果是否一定相同!

我想知道是否有一种方法可以通过一些中间应用程序更好地管理这个问题,这些应用程序可以与Excel协商更广泛的剪贴板交换,从而可以将明确的格式传递给浏览器?我知道,这并不是一个无缝的用户体验,但是当你进入这项技术时,很快就会发现应用程序间的复制和粘贴确实非常很难

鉴于格式错误的数据应该是例外,我想我会继续编写一个解析器(你可以用一个或两个正则表达式)来处理“正常”情况并将解析后的数据提交回来向用户进行确认,能够编辑未正确解析的行。有了一点Ajax魔法,我猜你可以提供一些相当光滑的东西。

答案 4 :(得分:0)

您可以使用Microsoft已提供的TextFieldParser类: http://msdn.microsoft.com/en-us/library/microsoft.visualbasic.fileio(v=vs.110).aspx