公告:1)网站程序升级:Q2A升级到1.8.6,Wordpress升级到5.7.2
2)修复了头像加载慢与提交问题反应慢等问题
2021-06-16

欢迎来到 Mathematica 问答社区

提问时请贴上文本代码

语法高亮:在编辑器中点击

被禁止的话题:广告破解

请阅读:《提问的智慧》

备用域名:mma.ooo

支持LaTex数学公式
行内公式标识符:\$ 或“$\backslash ($”+“$\backslash )$”,
行间公式标识符:\$\$ 或 “$\backslash [$”+“$\backslash ]$”

社区建议QQ群:365716997

分类

0 投票
2.1k 浏览

我在Excel复制了两列数据,然后在MMA使用Paste[]命令,发现无法返回内容,使用Paste[]//Table后,发现返回的数据并不是列表格式,且数据之间无间断,貌似MMA把制表符吃掉了...

  

但是Matlab里面的剪贴板操作没有问题,中间用空格隔开了,不过Matlab产生了数值误差,比如原数据19.479701被粘贴为19.479700999999999

分类:导入导出 | 用户: mma-2-2-2 (1.3k 分)
修改于 用户:mma-2-2-2
通通导入进来,然后再用mma提取呗

3 个回答

+2 投票
 
已采纳

我得说mma的Paste真是巨恶心,但官方认为这些异常行为并不是bug,我只好用.NET埋头造了个PasteContent了

PastContent[] := 
 Block[{img, width, Width, height, Height, LockBits, PixelFormat, 
   Format24bppRgb, stride, Stride, Scan0, totalB, byte, intPtr, data, 
   UnlockBits, lock}, Needs["NETLink`"]; 
  NETLink`NETBlock[NETLink`InstallNET[];
   NETLink`LoadNETType["System.Windows.Forms.Clipboard"];
   Which[Clipboard`ContainsText[], 
    If[Clipboard`GetText[] // 
      StringStartsQ[#, "\\!\\("] && StringEndsQ[#, "\\)"] &, 
     ToExpression[Clipboard`GetText[]], Clipboard`GetText[]], 
    Clipboard`ContainsImage[], 
    NETLink`LoadNETType /@ {"System.Drawing.Rectangle", 
      "System.Drawing.Imaging.ImageLockMode", 
      "System.Runtime.InteropServices.Marshal"};
    img = Clipboard`GetImage[];
    width = img[Width]; height = img[Height];
    lock = 
     img[LockBits[Rectangle`FromLTRB[0, 0, width, height], 
       ImageLockMode`ReadWrite, img[PixelFormat][Format24bppRgb]]];
    stride = Abs[lock[Stride]]; intPtr = lock[Scan0];
    totalB = stride*height;
    byte = NETLink`NETNew["System.Byte[]", totalB];
    Marshal`Copy[intPtr, byte, 0, totalB];
    data = NETLink`NETObjectToExpression[byte];
    Marshal`Copy[byte, 0, intPtr, totalB]; img[UnlockBits[lock]];
    Image[
     Map[Reverse /@ Partition[#, 3] &, 
      Partition[data, width*3, stride]], "Byte"], 
    Clipboard`ContainsFileDropList[], 
    NETLink`NETObjectToExpression[Clipboard`GetFileDropList[]]]]]

这个是有返回值的,而且不会莫名去掉剪贴板里的内容,可以面对当剪贴板里是图片、文本,mma表达式、mma图片等所有我能想到的情况,如果是复制的文件,就会返回文件的地址,跟mma的行为一样。总之应该可以正常处理一切,用于你这问题的时候,只需要

ImportString[PastContent[], "Table"]

比如这图会返回

{{2,2},{3,3},{4,4},{5,5},{6,6}}


当然,内置的Paste也是可以抢救一下的,我之前也写过一个

ClipboardContent := 
 Module[{string = 
    First[FrontEndExecute[
      FrontEnd`ExportPacket[NotebookGet[ClipboardNotebook[]], 
       "InputText"]]]}, 
  If[StringContainsQ[string, "CompressedData["], ToExpression[string],
    string]]

但这函数处理不了你所遇到的情况,因为mma会自动把你Excel里的\t和\n吃掉,但它可以在一般情况下给你一个返回值,效率没有用.NET的好,不嫌弃的话也可以用用

用户: Lozmlve*永 (1.1k 分)
修改于 用户:Lozmlve*永
神勇!(好吧,括号内请忽略,凑字用)
+2 投票

……你们为什么一个两个的都要用Paste。直接粘贴的时候是可以保留换行的啊,只要你预先打上表示字符串的引号:

用户: xzczd (2.1k 分)
已吐血。。我不知道可以这么用啊,只会霸王硬上弓。另外,你知道我琢磨这事好久了,咋不早说嘞~哎,我先去厕所哭一会。。
……我哪知道你不知道这个啊,这个在我脑子里算常识级的,Paste我反而不熟,.NETLink更是一窍不通,结果我看到你把.NetLink都祭出来了,当然以为你有什么高大上的任务要做,哪里想得到居然是因为这种理由啊……
倒不全是,我最终的目的是希望一个快捷键后把剪贴板的图片送到图床里去,并返回图片的外链到剪贴板,所有的操作甚至不需要打开mma(但只需要电脑安装mma),目前离这一步好像还有点距离,不过好像也基本快实现了
……等下,光听你这么说,怎么感觉这一整套流程压根就没Mathematica什么事情……
应该可以,mma+autohotkey,你有兴趣的话我倒时候实现了可以发一下给你
+1 投票
一般都采用Import[]函数进行导入。

比如:Import["C:\\Users\\HanHe\\Desktop\\PZT.xlsx"]
用户: 奋斗的大灰狼 (206 分)
...