王侃 发表于 2012-12-16 17:09:52

新手帖:如何从Excel剪贴板获得二维数组

学习使用C#来开发autocad已经近两周。
由于开发的是工程小插件,免不了经常需要在Cad和Excel的数据间进行切换。
这里贴出一段代码,示例如何从Excel按Ctrl+C后(剪贴板)生成一个二维数组。
但这段代码希望高手能够提供改进意见,因为有如下问题仍未处理:
1)未判断数据类型是否来自于Excel
2)未判断剪贴板上是否有数据

public static double[][] GetDataFromExcel()
      {
            if (System.Windows.Forms.Clipboard.GetDataObject() != null) // 确保粘贴板中有内容
            {
                Document dc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
                Editor ed = dc.Editor;
                IDataObject io = System.Windows.Forms.Clipboard.GetDataObject();
                string strSum = (string)io.GetData(DataFormats.Text);
                string[] strRows = strSum.Split('\n');
                int rowNum = strRows.Length-1; // 获得行数
                string[] strCols = strRows.Split('\t');
                int colNum = strCols.Length;
                double[][] res = new double[];
                for (int i = 0; i < rowNum; i++)
                {
                  res = new double;
                  string[] newCol = strRows.Split('\t');
                  for (int j = 0; j < colNum; j++)
                  {
                        try
                        {
                            res = double.Parse(newCol);
                        }
                        catch (System.Exception err)
                        {
                            ed.WriteMessage("\n 数据有误" + err.Message);
                        }
                        finally
                        {
                            ed.WriteMessage("\n" + res.ToString());
                        }
                  }
                }
                return res;
                // 以下为测试代码
                //Document rxDoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
                //Editor ed = rxDoc.Editor;
                //for (int i = 0; i < rowNum; i++)
                //{
                //    ed.WriteMessage("\n");
                //    for (int j = 0; j < colNum; j++)
                //    {
                //      ed.WriteMessage(res.ToString() + "\t");
                //    }
                //}
                ////return res;
                //ed.WriteMessage("\n 共" + rowNum.ToString()+"行");
                //ed.WriteMessage("\n 共" + colNum.ToString() + "列");               
            }
            else
            {
                Document rxDoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
                Editor ed = rxDoc.Editor;
                ed.WriteMessage("\n检测到未从Excel中复制内容,请重试。");
                double[][] res = new double[];
                return res;
            }
      }


注意包含以下API空间引用:

using System.Data;
using System.IO;
using System.Windows.Forms;
using System.Web;
using System.Reflection;
using excel = Microsoft.Office.Interop.Excel;
using System.ComponentModel;
using System.Runtime.Serialization.Formatters.Binary;

可取消注释掉的代码在命令行内看执行结果。

badboy518 发表于 2012-12-20 16:01:43

DataFormats可以判断类型。
页: [1]
查看完整版本: 新手帖:如何从Excel剪贴板获得二维数组