明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 24539|回复: 76

[经验] 动态读取Excel中的内容

    [复制链接]
发表于 2017-7-31 15:45:47 | 显示全部楼层 |阅读模式
本帖最后由 springwillow 于 2017-7-31 16:29 编辑

最近研究多线程,试验编写了一个动态读取Excel中内容的程序,程序读取第一个打开的Excel的选中区域,并生成到CAD中,创建一个线程每隔3s读取一次excel,如果发生变化则更新CAD。目前只编译了R19。发现bug可以跟帖回复,能完善的我尽量完善。




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
"觉得好,就打赏"
    共1人打赏
发表于 2017-8-18 09:00:31 | 显示全部楼层
从技术的角度来说,很不错。从实用的角度来说,华而不实。
回复 支持 0 反对 1

使用道具 举报

 楼主| 发表于 2017-8-18 18:12:01 | 显示全部楼层
把主要源码给大家,有想学的可以看看,写的比较烂,大家对付看吧
  1. // (C) Copyright 2002-2007 by Autodesk, Inc.
  2. //
  3. // Permission to use, copy, modify, and distribute this software in
  4. // object code form for any purpose and without fee is hereby granted,
  5. // provided that the above copyright notice appears in all copies and
  6. // that both that copyright notice and the limited warranty and
  7. // restricted rights notice below appear in all supporting
  8. // documentation.
  9. //
  10. // AUTODESK PROVIDES THIS PROGRAM "AS IS" AND WITH ALL FAULTS.
  11. // AUTODESK SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTY OF
  12. // MERCHANTABILITY OR FITNESS FOR A PARTICULAR USE.  AUTODESK, INC.
  13. // DOES NOT WARRANT THAT THE OPERATION OF THE PROGRAM WILL BE
  14. // UNINTERRUPTED OR ERROR FREE.
  15. //
  16. // Use, duplication, or disclosure by the U.S. Government is subject to
  17. // restrictions set forth in FAR 52.227-19 (Commercial Computer
  18. // Software - Restricted Rights) and DFAR 252.227-7013(c)(1)(ii)
  19. // (Rights in Technical Data and Computer Software), as applicable.
  20. //

  21. //-----------------------------------------------------------------------------
  22. //----- acrxEntryPoint.cpp
  23. //-----------------------------------------------------------------------------
  24. #include "StdAfx.h"
  25. #include "resource.h"
  26. #include "CApplication.h"
  27. #include "CWorkbook.h"
  28. #include "CWorkbooks.h"
  29. #include "CWorksheet.h"
  30. #include "CWorksheets.h"
  31. #include "CRange.h"
  32. #include "CBorder.h"
  33. #include "CBorders.h"
  34. #include "CFont0.h"
  35. #include <comdef.h>
  36. #include <list>
  37. #include <vector>
  38. #include "Calculation.h"
  39. //-----------------------------------------------------------------------------
  40. #define szRDS _RXST("YCL")
  41. using namespace std;
  42. bool IsExitThreade = false;
  43. // 边框的类型 Borders[N]
  44. // xlEdgeLeft 左=1
  45. //         xlEdgeRight 右=2
  46. //         xlEdgeTop 顶=3
  47. //         xlEdgeBottom 底=4
  48. //         xlDiagonalUp 左上右下=5
  49. //         xlDiagonalDown 左下右上=6
  50. //         xlEdgeLeft 外部左边框=7
  51. //         xlEdgeTop 外部上边框=8
  52. //         xlEdgeBottom 外部下边框=9
  53. //         xlEdgeRight 外部右边框=10
  54. //         xlInsideVertical 内部竖线=11
  55. //         xlInsideHorizontal 内部横线=12
  56. //         (其中1:为左 2:右 3:顶  4:底  5:斜\ 6:斜/)
  57. // #define xlEdgeLeft 1
  58. // #define xlEdgeTop 2
  59. // #define xlEdgeBottom 3
  60. // #define xlEdgeRight 4
  61. // #define xlDiagonalUp 5
  62. // #define xlDiagonalDown 6
  63. // #define xlEdgeLeft 7
  64. // #define xlEdgeTop 8
  65. // #define xlEdgeBottom 9
  66. // #define xlEdgeRight 10
  67. // #define xlInsideVertical 11
  68. // #define xlInsideHorizontal 12
  69. #define Aligndefault 0
  70. #define Alignleft 1
  71. #define AlignCenter 2
  72. #define AlignRight 3
  73. //定义几个传递表信息所需要的结构体
  74. struct TableLine
  75. {
  76.         //线的起始点
  77.         bool IsRowcontinue;
  78.         bool IsColcontinue;
  79.         AcGePoint3d TopStartPoint;
  80.         AcGePoint3d TopEndPoint;
  81.         AcGePoint3d BottomStartPoint;
  82.         AcGePoint3d BottomEndPoint;
  83.         AcGePoint3d TopCurentPoint;
  84.         AcGePoint3d BottomCurentPoint;
  85. };
  86. //单元格信息
  87. struct TextInfo
  88. {
  89.         //行号
  90.         int RowNum;
  91.         //列号
  92.         int ColNum;
  93.         //行高
  94.         float rowheiht;
  95.         //列宽
  96.         float colwidth;
  97.         //单元格内容
  98.         TCHAR text[512];
  99.         //单元格字高
  100.         float texthight;
  101.         //是否是合并单元格
  102.         bool IsMergeCells;
  103.         //合并单无格的行数
  104.         int UnionRowNums;
  105.         //合并单元格的列数
  106.         int UnionColNums;
  107.         //合并单元格的起始行
  108.         int UnionStartRowNum;
  109.         //合并单元格的起始列
  110.         int UnionStartColNum;
  111.         AcGePoint3d LUPoint;
  112.         AcGePoint3d RUPoint;
  113.         AcGePoint3d LBPoint;
  114.         AcGePoint3d RBPoint;
  115.         bool IsTop;
  116.         bool IsBottom;
  117.         bool IsLeft;
  118.         bool IsRight;
  119.         int HorizontalAlignment;
  120.         AcDbObjectId Objectid;
  121. };



  122. AcGePoint3d ptInsert;
  123. ads_real Scale =1;
  124. // 将实体添加到图形数据库的模型空间
  125. AcDbObjectId PostToModelSpace(AcDbEntity* pEnt)
  126. {
  127.         AcDbBlockTable *pBlockTable;
  128.         acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable, AcDb::kForRead);
  129.         AcDbBlockTableRecord *pBlockTableRecord;
  130.         acDocManager->lockDocument(curDoc());
  131.         if(pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite) == Acad::eOk)
  132.         {
  133.                 AcDbObjectId entId;
  134.                 pBlockTableRecord->appendAcDbEntity(entId, pEnt);
  135.                 pBlockTable->close();
  136.                 pBlockTableRecord->close();
  137.                 pEnt->close();
  138.                 // 解锁文档
  139.                 acDocManager->unlockDocument(curDoc());
  140.                 return entId;
  141.         }
  142.         // 解锁文档
  143.         acDocManager->unlockDocument(curDoc());
  144.         return NULL;
  145. }
  146. //其中CurrTextStyle(styleName)是得到当前字体样式,函数如下:
  147. bool FindTextStyle(TCHAR* textStyle)
  148. {
  149.         bool ret = false;
  150.         AcDbTextStyleTable *pTextStyleTbl = NULL;
  151.         acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pTextStyleTbl, AcDb::kForRead);
  152.         AcDbTextStyleTableIterator *pIt = NULL;
  153.         pTextStyleTbl->newIterator(pIt);
  154.         for (;!pIt->done();pIt->step())
  155.         {
  156.                 AcDbTextStyleTableRecord *pRcd = NULL;
  157.                 if (pIt->getRecord(pRcd, AcDb::kForRead) == Acad::eOk)
  158.                 {
  159.                         TCHAR *szName = NULL;
  160.                         pRcd->getName(szName);
  161.                         if (_tcscmp(szName,textStyle) == 0)
  162.                         {
  163.                                 pRcd->close();
  164.                                 ret = true;
  165.                                 break;
  166.                         }
  167.                         acutDelString(szName);
  168.                         pRcd->close();
  169.                 }
  170.         }
  171.         delete pIt;
  172.         pTextStyleTbl->close();
  173.         return ret;
  174. }
  175. bool CurrTextStyle(TCHAR *&styleName,TCHAR *&fontName,TCHAR *&bigFontName,AcDbObjectId &Id)  
  176. {  
  177.         Id = acdbHostApplicationServices()->workingDatabase()->textstyle();  
  178.         AcDbTextStyleTableRecord* pStyleRecord;  
  179.         if(acdbOpenObject((AcDbObject *&)pStyleRecord, Id, AcDb::kForRead) == Acad::eOk) {  
  180.                 const TCHAR *name;  
  181.                 pStyleRecord->getName(name);
  182.                 _tcscpy(styleName, name);
  183.                 pStyleRecord->fileName(name);
  184.                 _tcscpy(fontName, name);
  185.                 pStyleRecord->bigFontFileName(name);
  186.                 _tcscpy(bigFontName, name);
  187.                 pStyleRecord->close();
  188.                 return true;
  189.         }  
  190.         return false;
  191. //        else _tcscpy(styleName, _T("STANDARD"));  
  192. }
  193. //===========================创建文字样式===========================================
  194. AcDbObjectId createTextStyle(TCHAR* fontName,TCHAR* bigFontName,TCHAR* textStyleName)
  195. {
  196.         AcGiTextStyle *TextStyle=new AcGiTextStyle
  197.                 (fontName,
  198.                 bigFontName,
  199.                 0,
  200.                 1,
  201.                 0,
  202.                 0,
  203.                 Adesk::kFalse,
  204.                 Adesk::kFalse,
  205.                 Adesk::kFalse,
  206.                 Adesk::kFalse,
  207.                 Adesk::kFalse,
  208.                 Adesk::kFalse,
  209.                 textStyleName);      //字体名
  210.         AcDbObjectId textStyleId;
  211.         toAcDbTextStyle(*TextStyle,textStyleId);
  212.         return textStyleId;
  213. }
  214. //函数 CreateText,用于创建文字对象
  215. AcDbObjectId CreateText(const AcGePoint3d& LUInsert,const AcGePoint3d& RBInsert, const TCHAR *text, AcDbObjectId style, double height, double rotation,int HorizontalAlignment)
  216. {
  217.         AcGePoint3d InsertPoint;
  218.         switch (HorizontalAlignment)
  219.         {
  220.         case Aligndefault:
  221.                 {
  222.                         InsertPoint =CCalculation::MiddlePoint(LUInsert,RBInsert);
  223.                         AcDbText *pText = new AcDbText(InsertPoint,text, style, height,rotation);
  224.                         pText->setJustification(pText->kTextAlignmentMiddle);
  225.                         pText->setAlignmentPoint(InsertPoint);
  226.                         return PostToModelSpace(pText);
  227.                 }
  228.         case Alignleft:
  229.                 {
  230.                         InsertPoint =CCalculation::MiddlePoint(LUInsert,RBInsert);
  231.                         InsertPoint.x = LUInsert.x;
  232. //                        InsertPoint.y -= height * 0.5;
  233.                         AcDbText *pText = new AcDbText(InsertPoint,text, style, height,rotation);
  234.                         pText->setJustification(pText->kTextAlignmentMiddleLeft);
  235.                         pText->setAlignmentPoint(InsertPoint);
  236.                         return PostToModelSpace(pText);
  237.                 }
  238.         case AlignCenter:
  239.                 {
  240.                         InsertPoint =CCalculation::MiddlePoint(LUInsert,RBInsert);
  241. //                        InsertPoint.y -= height * 0.5;
  242.                         AcDbText *pText = new AcDbText(InsertPoint,text, style, height,rotation);
  243.                         pText->setJustification(pText->kTextAlignmentMiddleCenter);
  244.                         pText->setAlignmentPoint(InsertPoint);
  245.                         return PostToModelSpace(pText);
  246.                 }
  247.         case AlignRight:
  248.                 {
  249.                         InsertPoint =CCalculation::MiddlePoint(LUInsert,RBInsert);
  250.                         InsertPoint.x = RBInsert.x;
  251. //                        InsertPoint.y -= height * 0.5;
  252.                         AcDbText *pText = new AcDbText(InsertPoint,text, style, height,rotation);
  253.                         pText->setJustification(pText->kTextAlignmentMiddleRight);
  254.                         pText->setAlignmentPoint(InsertPoint);
  255.                         return PostToModelSpace(pText);
  256.                 }

  257.         };
  258.        
  259.         return NULL;
  260.        
  261. }
  262. //CreateMText 函数,用于添加多行文字
  263. AcDbObjectId CreateMText(const AcGePoint3d& LUInsert,const AcGePoint3d& RBInsert, const TCHAR *text, AcDbObjectId style, double height, int HorizontalAlignment,const AcGePoint3d& PointInsert,CString Caption,CString BookName,CString SheetName,int start_row,int start_col,int row_num,int col_num)
  264. {
  265.         AcDbMText *pMText = new AcDbMText();
  266.         AcGePoint3d InsertPoint;
  267.         double width = RBInsert.x - LUInsert.x - height * 0.4;
  268.         /*
  269.         //向对象写入扩展数据
  270.         TCHAR AppName[] ={ _T("ReadeEXCEL")};
  271.         ads_point pt;
  272.         pt[0] = PointInsert.x;
  273.         pt[1] = PointInsert.y;
  274.         pt[2] = PointInsert.z;
  275.         struct resbuf* pRb = acutBuildList(AcDb::kDxfRegAppName, AppName,     // 应用程序名称
  276.                 AcDb::kDxfXdAsciiString, Caption, // Excel标题
  277.                 AcDb::kDxfXdAsciiString, BookName, // 字符串
  278.                 AcDb::kDxfXdAsciiString, SheetName, // 字符串
  279.         AcDb::kDxfXdInteger32,start_row,
  280.         AcDb::kDxfXdInteger32,start_col,
  281.         AcDb::kDxfXdInteger32,row_num,
  282.         AcDb::kDxfXdInteger32,col_num,
  283.         AcDb::kDxfXdWorldXCoord,pt,
  284.         RTNONE);
  285.         pMText->setXData(pRb);
  286.         */
  287.         switch (HorizontalAlignment)
  288.         {
  289.         case Aligndefault:
  290.                 {
  291.                         InsertPoint =CCalculation::MiddlePoint(LUInsert,RBInsert);
  292.                         // 设置多行文字的特性
  293.                         pMText->setTextStyle(style);
  294.                         pMText->setContents(text);
  295.                         pMText->setLocation(InsertPoint);
  296.                         pMText->setTextHeight(height);
  297.                         pMText->setWidth(width);
  298.                         pMText->setAttachment(AcDbMText::kMiddleCenter);
  299.                         return PostToModelSpace(pMText);
  300.                 }
  301.         case Alignleft:
  302.                 {
  303.                         InsertPoint =CCalculation::MiddlePoint(LUInsert,RBInsert);
  304.                         InsertPoint.x = LUInsert.x + height * 0.2;
  305.                         pMText->setTextStyle(style);
  306.                         pMText->setContents(text);
  307.                         pMText->setLocation(InsertPoint);
  308.                         pMText->setTextHeight(height);
  309.                         pMText->setWidth(width);
  310.                         pMText->setAttachment(AcDbMText::kMiddleLeft);
  311.                         return PostToModelSpace(pMText);
  312.                 }
  313.         case AlignCenter:
  314.                 {
  315.                         InsertPoint =CCalculation::MiddlePoint(LUInsert,RBInsert);
  316.                         pMText->setTextStyle(style);
  317.                         pMText->setContents(text);
  318.                         pMText->setLocation(InsertPoint);
  319.                         pMText->setTextHeight(height);
  320.                         pMText->setWidth(width);
  321.                         pMText->setAttachment(AcDbMText::kMiddleCenter);
  322.                         return PostToModelSpace(pMText);
  323.                 }
  324.         case AlignRight:
  325.                 {
  326.                         InsertPoint =CCalculation::MiddlePoint(LUInsert,RBInsert);
  327.                         InsertPoint.x = RBInsert.x - height * 0.2;
  328.                         pMText->setTextStyle(style);
  329.                         pMText->setContents(text);
  330.                         pMText->setLocation(InsertPoint);
  331.                         pMText->setTextHeight(height);
  332.                         pMText->setWidth(width);
  333.                         pMText->setAttachment(AcDbMText::kMiddleRight);
  334.                         return PostToModelSpace(pMText);
  335.                 }
  336.         };

  337.         return NULL;
  338.        
  339. }
  340. // 创建直线
  341. AcDbObjectId CreateLine(AcGePoint3d ptStart, AcGePoint3d ptEnd)
  342. {
  343.         AcDbLine *pLine = new AcDbLine(ptStart, ptEnd);
  344.         // 将实体添加到图形数据库
  345.         AcDbObjectId lineId;
  346.         lineId = PostToModelSpace(pLine);
  347.         return lineId;
  348. }
  349. //该函数根据两个角点和线宽来创建矩形
  350. AcDbObjectId CreateRectangle(AcGePoint2d pt1, AcGePoint2d pt2, double width)
  351. {
  352.         // 提取两个角点的坐标值
  353.         double x1 = pt1.x, x2 = pt2.x;
  354.         double y1 = pt1.y, y2 = pt2.y;
  355.         // 计算矩形的角点
  356.         AcGePoint2d ptLeftBottom(CCalculation::Min(x1, x2), CCalculation::Min(y1, y2));
  357.         AcGePoint2d ptRightBottom(CCalculation::Max(x1, x2), CCalculation::Min(y1, y2));
  358.         AcGePoint2d ptRightTop(CCalculation::Max(x1, x2), CCalculation::Max(y1, y2));
  359.         AcGePoint2d ptLeftTop(CCalculation::Min(x1, x2), CCalculation::Max(y1, y2));
  360.         // 创建对应的多段线
  361.         AcDbPolyline *pPoly = new AcDbPolyline(4);
  362.         pPoly->addVertexAt(0, ptLeftBottom, 0, width, width);
  363.         pPoly->addVertexAt(1, ptRightBottom, 0, width, width);
  364.         pPoly->addVertexAt(2, ptRightTop, 0, width, width);
  365.         pPoly->addVertexAt(3, ptLeftTop, 0, width, width);
  366.         pPoly->setClosed(Adesk::kTrue);
  367.         // 将多段线添加到模型空间
  368.         AcDbObjectId polyId;
  369.         polyId = PostToModelSpace(pPoly);
  370.         return polyId;
  371. }

  372. //表格到处到Excel
  373. int DynamicWriteToExcel()
  374. {
  375.         ads_name ssname;
  376.         struct resbuf *rb;
  377.         rb = acutBuildList(RTDXF0,_T("TEXT,LWPOLYLINE,LINE"),RTNONE);
  378.         if(acedSSGet(NULL,NULL,NULL,rb,ssname) != RTNORM)
  379.         {
  380.                 acutRelRb(rb);

  381.         }
  382.         else
  383.         {
  384.                 acutRelRb(rb);
  385.                 Adesk::Int32 sslength;
  386.                 acedSSLength(ssname, &sslength);
  387. //                acutPrintf(_T("%d\n"),sslength);
  388.                 AcDbObjectId objId;
  389.                 AcDbObjectIdArray  LWpolyLineObjectIdArray ,LineObjectIdArray,TextObjectIdArray;
  390.                 for(int i = 0;i < sslength;i++)
  391.                 {
  392.                         ads_name ent;
  393.                         acedSSName(ssname, i, ent);
  394.                         acdbGetObjectId(objId, ent);
  395.                         AcDbEntity *pEnt;
  396.                         //将对象按类型分类
  397.                         if(acdbOpenAcDbEntity((AcDbEntity *&)pEnt, objId, AcDb::kForRead) == Acad::eOk)
  398.                         {
  399.                                 if (pEnt->isKindOf(AcDb2dPolyline::desc()))
  400.                                 {
  401.                                         LWpolyLineObjectIdArray.append(objId);
  402.                                 }
  403.                                 else if(pEnt->isKindOf(AcDbLine::desc()))
  404.                                 {
  405.                                         LineObjectIdArray.append(objId);
  406.                                 }
  407.                                 else if(pEnt->isKindOf(AcDbLine::desc()))
  408.                                 {
  409.                                         TextObjectIdArray.append(objId);
  410.                                 }

  411.                                 pEnt->close();
  412.                         }
  413.                 }

  414.         }
  415.         return 0;
  416. }


  417. BOOL CALLBACK EnumChildProc(
  418.         HWND hwnd,      // handle to child window
  419.         LPARAM lParam   // application-defined value
  420.         )
  421. {
  422.         TCHAR szText[50];
  423.         CString strBuffer;
  424.         ::GetWindowText(hwnd,szText,50);
  425.         strBuffer.Format(szText);
  426.         if (strBuffer.Find(_T("Book")) != -1)
  427.         {
  428.                 ::PostMessage(hwnd,WM_KEYDOWN,VK_TAB,0);
  429.                 ::PostMessage(hwnd,WM_KEYUP,VK_TAB,0);
  430.                 Sleep(500);
  431.                 ::PostMessage(hwnd,WM_KEYDOWN,VK_LEFT,0);
  432.                 ::PostMessage(hwnd,WM_KEYUP,VK_LEFT,0);
  433.         }
  434.        

  435. //         PWINDOWINFO pwindowinfo = NULL;
  436. //         ::GetWindowInfo(hwnd,pwindowinfo);
  437. //         if (pwindowinfo != NULL)
  438. //         {
  439. //                 if( pwindowinfo->dwWindowStatus == 0)
  440. //                         IsContinue = true;
  441. //                 else
  442. //                         IsContinue = false;
  443. //         }
  444.         return TRUE;



  445. //         //需要枚举子窗口,因为状态栏为子窗口,获取状态栏的句柄
  446. //         TCHAR temp1[50];
  447. //         if(hwnd)
  448. //         {
  449. //                 ::GetClassName(hwnd,temp1,255);
  450. //                 if(_tcscmp(temp1,_T("NetUIHWND")))//这个字符串使用spy++或者spyxx获得的状态栏类名
  451. //                 {           
  452. //                         int nItemCount;
  453. //                         int i;
  454. //                         TCHAR chBuffer[50];
  455. //                         DWORD dwProcessID;
  456. //                         HANDLE hProcess;
  457. //                         void * Pointer;
  458. //                         SIZE_T nNumberOfBytesRead;
  459. //                         nItemCount = ::SendMessage(hwnd, SB_GETPARTS, 0, 0);
  460. //                         ::GetWindowThreadProcessId(hwnd, &dwProcessID);//和dwProcessID=pID效果一样
  461. //                         hProcess = OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE,false,dwProcessID);
  462. //                         Pointer = VirtualAllocEx(hProcess,NULL,4096,MEM_RESERVE | MEM_COMMIT,PAGE_READWRITE);
  463. //                         for(i= 0 ; i < 4 ; ++i)
  464. //                         {
  465. //                                 ::SendMessage(hwnd, SB_GETTEXT, i, (LPARAM)Pointer);
  466. //                                 ::ReadProcessMemory(hProcess, Pointer,chBuffer, sizeof(chBuffer), &nNumberOfBytesRead);
  467. //                                 AfxMessageBox(chBuffer);
  468. //                         }
  469. //                         VirtualFreeEx(hProcess,Pointer,0, MEM_RELEASE);
  470. //                         CloseHandle(hProcess);
  471. //                         return true;
  472. //                 }
  473. //         }
  474. //         return true;
  475. }

  476. //关联线程函数
  477. DWORD WINAPI ThreadProc(
  478.         LPVOID lpParameter   // thread data
  479.         )
  480. {
  481. //         //检查当前字体样式
  482. //         TCHAR  StrStyleName[50];
  483. //         TCHAR*  CurStyleName = new TCHAR[40];
  484. //         TCHAR* StrFileName = new TCHAR[40];
  485. //         TCHAR* StrBigFontFileName =new TCHAR[40];
  486. //         AcDbObjectId CurSthyleID=NULL,StyleID=NULL;
  487. //         if (CurrTextStyle(CurStyleName,StrFileName,StrBigFontFileName,CurSthyleID))
  488. //         {
  489. //                 _tcscpy_s(StrStyleName,CurStyleName);
  490. //                 _tcscat(StrStyleName,_T("_xls"));
  491. //                
  492. //                 if (!FindTextStyle(StrStyleName))
  493. //                 {
  494. //                         if (_tcscmp(StrFileName,_T("")) == 0)
  495. //                         {
  496. //                                 StyleID = createTextStyle(_T("arial.ttf"),_T("gbcbig.shx"),StrStyleName);
  497. //                         }
  498. //                         else
  499. //                         {
  500. //                                 StyleID = createTextStyle(StrFileName,StrBigFontFileName,StrStyleName);
  501. //                         }
  502. //                 }
  503. //         }
  504. //         else
  505. //         {
  506. //                 _tcscpy_s(StrStyleName,_T("Standard_xls"));
  507. //                 createTextStyle(_T("gbenor.shx"),_T("gbcbig.shx"),StrStyleName);
  508. //         }
  509. //         delete [] StrFileName;
  510. //         delete [] StrBigFontFileName;
  511.         //常用变量定义
  512.         CApplication app;   
  513.         CWorkbooks Workbooks;
  514.         CWorkbook Workbook;
  515.         CWorksheets Worksheets;
  516.         CWorksheet Worksheet;
  517.         CRange ranges;
  518.         CRange iCell;
  519.         LPDISPATCH lpDisp;  
  520.         COleVariant
  521.                 covTrue((short)TRUE),
  522.                 covFalse((short)FALSE),
  523.                 covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);      
  524.         COleVariant vResult;
  525.         TextInfo* TextInfoArr =(TextInfo*)lpParameter;
  526.         //采用MFC方式初始化COM库,程序结束时COM库会自动释放
  527. //         if(!AfxOleInit())
  528. //         {
  529. //
  530. //                 MessageBox(NULL,_T("初始化COM支持库失败!\n无法控制Excel!更新线程退出!"),_T("警告"),MB_ICONERROR | MB_OK);  
  531. //                 delete[] TextInfoArr;
  532. //                 ::ExitThread(1);
  533. //                 return 0;
  534. //         }
  535.         //关联已经运行的Excel实例
  536.         CString str = TextInfoArr[0].text;
  537.         int booknamelen = str.Find(_T(","));
  538.         CString BookName = str.Left(booknamelen);
  539.         CString Caption = str.TrimLeft(BookName);
  540.         Caption = Caption.TrimLeft(_T(","));
  541.         booknamelen = Caption.Find(_T(","));
  542.         CString SheetName=Caption.Left(booknamelen);
  543.         Caption = Caption.TrimLeft(SheetName);
  544.         Caption = Caption.TrimLeft(_T(","));
  545.         int start_row = TextInfoArr[0].UnionStartRowNum;
  546.         int start_col = TextInfoArr[0].UnionStartColNum;
  547.         int row_nums = TextInfoArr[0].RowNum;
  548.         int col_nums = TextInfoArr[0].ColNum;
  549.         bool IsContinue = false;
  550.         HWND hExcel = NULL;
  551.         while (TRUE)
  552.         {
  553.                
  554.                 if (IsExitThreade)
  555.                 {
  556.                         app.ReleaseDispatch ();
  557.                         delete[] TextInfoArr;
  558.                         AfxOleTerm();
  559.                         return 2;;
  560.                 }
  561.                 //如果当前窗口是Excel窗口,则不读取

  562.                 HWND hwnd = FindWindow(TEXT("XLMAIN"),Caption);
  563.                 HWND Forehwnd =GetForegroundWindow();
  564.                 if (hwnd == NULL)
  565.                 {
  566.                         app.ReleaseDispatch ();
  567.                         delete[] TextInfoArr;
  568.                         AfxOleTerm();
  569.                         ::MessageBox(NULL, _T("关联的Excel关闭或有其它Excel打开,关联线程退出!"), _T("警告"), MB_ICONHAND);
  570.                         return 2;
  571.                 }
  572.                 else if(Forehwnd == hwnd)
  573.                 {
  574.                         Sleep(2000);
  575.                         IsContinue = true;
  576.                         continue;
  577.                 }
  578.                 else if(FindWindow(NULL,TEXT("Microsoft Office Excel")) != Forehwnd)
  579.                 {
  580.                         if(IsContinue)
  581.                         {
  582.                                 EnumChildWindows(hwnd,EnumChildProc,NULL);
  583.                                 IsContinue = false;
  584.                         }
  585.                         else
  586.                         {
  587.                                 Sleep(2000);
  588.                                 continue;
  589.                         }
  590.                 }
  591.                 else
  592.                 {
  593.                         Sleep(2000);
  594.                         continue;
  595.                 }


  596.                 CLSID clsid;
  597.                 CLSIDFromProgID(L"Excel.Application", &clsid);  
  598.                 IUnknown *pUnk = NULL;
  599.                 IDispatch *pRunDisp = NULL;

  600.                 for(long i=1;i<=5;i++) //做5次尝试
  601.                 {
  602.                         HRESULT hr = GetActiveObject(clsid, NULL, (IUnknown**)&pUnk);
  603.                         if(SUCCEEDED(hr))
  604.                         {
  605.                                 hr = pUnk->QueryInterface(IID_IDispatch, (void **)&pRunDisp);
  606.                                 break;
  607.                         }
  608.                         ::Sleep(10);
  609.                 }


  610.                 if (!pRunDisp)
  611.                 {
  612.                         ::MessageBox(NULL, _T("没有发现Excel!更新线程退出!"), _T("警告"), MB_ICONHAND);
  613.                         //如果VectorTableinfo不为空则将其清空
  614.                         delete[] TextInfoArr;
  615. /*                        delete[] CurStyleName;*/
  616.                         AfxOleTerm();
  617.                         return 2;
  618.                 }
  619.                 if (pUnk)  pUnk->Release();
  620.                
  621.                 //关联Excel
  622.                 app.AttachDispatch (pRunDisp);
  623.                 //获取当前激活的workbooks
  624.                 lpDisp=app.get_Workbooks();
  625.                 if(lpDisp==NULL)
  626.                 {
  627.                         MessageBox(NULL,_T( "没有发现有效的Book!"), _T("TrueTable"),MB_ICONERROR | MB_OK);
  628.                         app.ReleaseDispatch ();
  629.                         //如果VectorTableinfo不为空则将其清空
  630.                         delete[] TextInfoArr;
  631.                         AfxOleTerm();
  632.                         return 2;
  633.                 }
  634.                 Workbooks.AttachDispatch(lpDisp);
  635.                 for (int i=0;i<Workbooks.get_Count();i++)
  636.                 {
  637.                         bool IsBreak=false;
  638.                         lpDisp=Workbooks.get_Item(COleVariant((long)i+1));
  639.                         if(lpDisp==NULL)
  640.                                 continue;
  641.                         Workbook.AttachDispatch(lpDisp);
  642.                         CString WorkBookName = Workbook.get_Name();
  643.                         if(_tcscmp(WorkBookName,BookName) != 0)
  644.                                 continue;
  645.                         lpDisp = Workbook.get_Worksheets();
  646.                         if(lpDisp == NULL)
  647.                         {
  648.                                 app.ReleaseDispatch ();
  649.                                 Workbooks.ReleaseDispatch();
  650.                                 //如果VectorTableinfo不为空则将其清空
  651.                                 delete[] TextInfoArr;
  652.                                 AfxOleTerm();
  653.                                 return 2;

  654.                         }
  655.                         Worksheets.AttachDispatch(lpDisp);
  656.                         for (int j=0;j<Worksheets.get_Count();j++)
  657.                         {
  658.                                 lpDisp = Worksheets.get_Item(COleVariant((long)j+1));
  659.                                 if(lpDisp == NULL)
  660.                                 {
  661.                                         app.ReleaseDispatch ();
  662.                                         Workbooks.ReleaseDispatch();
  663.                                         Workbook.ReleaseDispatch();
  664.                                         //如果VectorTableinfo不为空则将其清空
  665.                                         delete[] TextInfoArr;
  666. /*                                        delete[] CurStyleName;*/
  667.                                         AfxOleTerm();
  668.                                         return 2;
  669.                                 }
  670.                                 Worksheet.AttachDispatch(lpDisp);
  671.                                 if (_tcscmp(Worksheet.get_Name(),SheetName) != 0)
  672.                                         continue;
  673.                                 ranges.AttachDispatch(Worksheet.get_Cells());
  674.                                 //已经获取了想要的sheet,下一步就需要对表格的内容进行检测和修改了
  675.                                 for (int m=1;m<=TextInfoArr[0].RowNum * TextInfoArr[0].ColNum;m++)
  676.                                 {
  677.                                         TextInfo textinfo= TextInfoArr[m];
  678.                                         iCell.AttachDispatch(ranges.get_Item (COleVariant((long)textinfo.RowNum),COleVariant((long)textinfo.ColNum)).pdispVal );
  679.                                         CString text = iCell.get_Text();
  680.                                         iCell.ReleaseDispatch ();
  681.                                         if (_tcscmp(text,textinfo.text) == 0)
  682.                                         {
  683.                                                         continue;
  684.                                         }
  685.                                         if (_tcscmp(_T(""),text) == 0)
  686.                                         {
  687.                                                 AcDbObjectId ObjectId = textinfo.Objectid;
  688.                                                 AcDbText* pEnt=NULL;
  689.                                                 // 锁定文档
  690.                                                 acDocManager->lockDocument(curDoc());
  691.                                                 Acad::ErrorStatus es = acdbOpenObject((AcDbEntity *&)pEnt,ObjectId,AcDb::kForWrite);
  692.                                                 if (es == Acad::eOk)
  693.                                                 {
  694.                                                         pEnt->erase();
  695.                                                         _tcscpy(TextInfoArr[m].text,text);
  696.                                                         TextInfoArr[m].Objectid = NULL;
  697.                                                         pEnt->close();
  698.                                                         //更新屏幕显示
  699. //                                                        acedUpdateDisplay();
  700.                                                        
  701.                                                 }
  702.                                                 else if(es == Acad::eWasErased)
  703.                                                 {
  704.                                                         // 解锁文档
  705.                                                         acDocManager->unlockDocument(curDoc());
  706.                                                         ranges.ReleaseDispatch();
  707.                                                         Worksheet.ReleaseDispatch ();
  708.                                                         Worksheets.ReleaseDispatch ();
  709.                                                         Workbook.ReleaseDispatch ();
  710.                                                         Workbooks.ReleaseDispatch ();
  711.                                                         delete[] TextInfoArr;
  712.                                                         ::MessageBox(NULL, _T("有手动删除对象,线程退出!"), _T("警告"), MB_ICONHAND);
  713. /*                                                        delete[] CurStyleName;*/
  714.                                                         AfxOleTerm();
  715.                                                         return 2;
  716.                                                 }
  717.                                                 // 解锁文档
  718.                                                 acDocManager->unlockDocument(curDoc());
  719.                                         }
  720.                                         else
  721.                                         {
  722.                                                 if (_tcscmp(_T(""),textinfo.text) == 0)
  723.                                                 {
  724.                                                         _tcscpy(TextInfoArr[m].text,text);
  725.                                                         _tcscpy(textinfo.text,text);
  726. //                                                        AcGePoint3d InsertPoint =CCalculation::MiddlePoint(textinfo.LUPoint,textinfo.RBPoint);
  727.                                                         AcDbObjectId Obj = CreateMText(textinfo.LUPoint,textinfo.RBPoint,textinfo.text,AcDbObjectId::kNull,textinfo.texthight,textinfo.HorizontalAlignment,ptInsert,Caption,BookName,SheetName,start_row,start_col,row_nums,col_nums);
  728.                                                         if (Obj != NULL)
  729.                                                         {
  730.                                                                 TextInfoArr[m].Objectid = Obj;
  731. //                                                                acedUpdateDisplay();
  732.                                                         }
  733.                                                          
  734.                                                 }
  735.                                                 else
  736.                                                 {
  737.                                                         AcDbObjectId ObjectId = textinfo.Objectid;
  738.                                                         AcDbMText* pEnt=NULL;
  739.                                                         // 锁定文档
  740.                                                         acDocManager->lockDocument(curDoc());
  741.                                                         Acad::ErrorStatus es = acdbOpenObject((AcDbEntity *&)pEnt,ObjectId,AcDb::kForWrite);
  742.                                                         AcDbObjectId  StyleObjectId;
  743.                                                         if (es == Acad::eOk)
  744.                                                         {
  745.                                                                 pEnt->setContents(text);
  746. //                                                                 pEnt->adjustAlignment(acdbHostApplicationServices()->workingDatabase());
  747. //                                                                 pEnt->recordGraphicsModified(true);
  748. //                                                                acedUpdateDisplay();
  749. //                                                                 StyleObjectId = pEnt->textStyle();
  750. //                                                                 if (StyleID != NULL && StyleObjectId != StyleID)
  751. //                                                                 {
  752. //                                                                         pEnt->setTextStyle(StyleID);
  753. //                                                                 }
  754. //                                                                 else if (CurSthyleID != NULL && CurSthyleID != StyleObjectId)
  755. //                                                                 {
  756. //                                                                         pEnt->setTextStyle(StyleObjectId);
  757. //                                                                 }
  758.                                                                 _tcscpy(TextInfoArr[m].text,text);
  759.                                                                 pEnt->close();
  760.                                                                
  761.                                                         }
  762.                                                         else if(es == Acad::eWasErased)
  763.                                                         {
  764.                                                                 // 解锁文档
  765.                                                                 acDocManager->unlockDocument(curDoc());
  766.                                                                 ranges.ReleaseDispatch();
  767.                                                                 Worksheet.ReleaseDispatch ();
  768.                                                                 Worksheets.ReleaseDispatch ();
  769.                                                                 Workbook.ReleaseDispatch ();
  770.                                                                 Workbooks.ReleaseDispatch ();
  771.                                                                 delete[] TextInfoArr;
  772.                                                                 ::MessageBox(NULL, _T("有手动删除对象,线程退出!"), _T("警告"), MB_ICONHAND);
  773. /*                                                                delete[] CurStyleName;*/
  774.                                                                 AfxOleTerm();
  775.                                                                 return 2;
  776.                                                         }
  777.                                                         // 解锁文档
  778.                                                         acDocManager->unlockDocument(curDoc());
  779.                                                        
  780.                                                 }
  781.                                         }
  782.                                        
  783.                                 }
  784.                                 ranges.ReleaseDispatch();
  785.                                 Worksheet.ReleaseDispatch ();
  786.                                 Worksheets.ReleaseDispatch ();
  787.                                 Workbook.ReleaseDispatch ();
  788.                                 Workbooks.ReleaseDispatch ();
  789.                                 IsBreak=true;
  790.                                 break;
  791.                         }
  792.                         if(IsBreak)
  793.                                 break;
  794.                 }
  795.                
  796.         }
  797.         //释放Dispatch
  798.        
  799.         //如果VectorTableinfo不为空则将其清空
  800.         delete[] TextInfoArr;
  801.         app.ReleaseDispatch ();

  802.         return 1;
  803. }
  804. //动态从Excel读取数据
  805. int DynamicReadFromExcel()
  806. {
  807.        
  808.         //常用变量定义
  809.         CApplication app;   
  810.         CWorkbooks books;
  811.         CWorkbook book;
  812.         CWorksheets sheets;
  813.         CWorksheet sheet;
  814.         CRange ranges,range;
  815.         CRange iCell,UnionRange,UnionRanges;
  816.         CRange RangeRow,RangeCol;
  817.         CFont0 Font0;
  818.         LPDISPATCH lpDisp;  
  819.         LPDISPATCH Workbooks;
  820.         COleVariant
  821.                 covTrue((short)TRUE),
  822.                 covFalse((short)FALSE),
  823.                 covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);      
  824.         COleVariant vResult;

  825.         acdbRegApp(_T("ReadeEXCEL"));

  826.         //采用MFC方式初始化COM库,程序结束时COM库会自动释放
  827.         if(!AfxOleInit())
  828.         {
  829.                 MessageBox(NULL,_T("初始化COM支持库失败!\n无法控制Excel!"),_T("TrueTable"),MB_ICONERROR | MB_OK);  
  830.                 return RTERROR;
  831.         }

  832.         //关联已经运行的Excel实例
  833.         CLSID clsid;
  834.         CLSIDFromProgID(L"Excel.Application", &clsid);  
  835.         IUnknown *pUnk = NULL;
  836.         IDispatch *pRunDisp = NULL;

  837.         for(long i=1;i<=5;i++) //做5次尝试
  838.         {
  839.                 HRESULT hr = GetActiveObject(clsid, NULL, (IUnknown**)&pUnk);
  840.                 if(SUCCEEDED(hr))
  841.                 {
  842.                         hr = pUnk->QueryInterface(IID_IDispatch, (void **)&pRunDisp);
  843.                         break;
  844.                 }
  845.                 ::Sleep(10);
  846.         }


  847.         if (!pRunDisp)
  848.         {
  849.                 ::MessageBox(NULL, _T("没有发现Excel!"), _T("TrueTable"), MB_ICONHAND);
  850.                 return RTERROR;
  851.         }
  852.         if (pUnk)  pUnk->Release();

  853.         //关联Excel
  854.         app.AttachDispatch (pRunDisp);

  855.         CString Caption = app.get_Caption();
  856.         //获取当前激活的sheet
  857.         lpDisp=app.get_ActiveSheet();
  858.         if(lpDisp==NULL)
  859.         {
  860.                 MessageBox(NULL,_T( "没有发现有效的表格!"), _T("TrueTable"),MB_ICONERROR | MB_OK);
  861.                 app.ReleaseDispatch ();
  862.                 return RTERROR;
  863.         }
  864.         sheet.AttachDispatch(lpDisp);
  865.         //读取sheet名
  866.         lpDisp=sheet.get_Parent();
  867.         if(lpDisp==NULL)
  868.         {
  869.                 MessageBox(NULL,_T( "没有发现有效的Book!"), _T("TrueTable"),MB_ICONERROR | MB_OK);
  870.                 app.ReleaseDispatch ();
  871.                 sheet.ReleaseDispatch();
  872.                 return RTERROR;
  873.         }
  874.         book.AttachDispatch(lpDisp);
  875.         CString BookName = book.get_Name();
  876.         CString SheetName=sheet.get_Name();


  877.         //获取选择区
  878.         LPDISPATCH Selectioned = app.get_Selection();
  879.         if (Selectioned == NULL)
  880.         {
  881.                 MessageBox(NULL,_T( "没有发现有效的表格!"), _T("TrueTable"),MB_ICONERROR | MB_OK);
  882.                 app.ReleaseDispatch ();
  883.                 sheet.ReleaseDispatch();
  884.                 book.ReleaseDispatch();
  885.                 return RTERROR;
  886.         }
  887.         vector<vector<TextInfo>>VectorTableinfo;
  888.         //选择的行数、列数:
  889.         long row_num,col_num,StartRow,StartCol;
  890.         ranges.AttachDispatch(Selectioned);
  891.         range.AttachDispatch(ranges.get_Rows());
  892.         row_num=range.get_Count();
  893.         range.AttachDispatch(ranges.get_Columns());
  894.         col_num=range.get_Count();
  895. //        ranges.AttachDispatch(Selectioned);
  896.         StartRow=range.get_Row();       //起始行
  897.         StartCol=range.get_Column();    //起始列
  898.         if(col_num<2 && row_num<2)     //未选中区域
  899.         {
  900.                 MessageBox(NULL,_T("\n当前表格未选中区域数据!"),_T("TrueTable"),MB_ICONERROR | MB_OK);
  901.                 app.ReleaseDispatch ();
  902.                 return RTERROR;

  903.         }
  904.         else
  905.         {
  906.                 ads_printf(_T("\n表格%s共选中%d行,%d列"),SheetName,row_num,col_num);
  907.         }



  908.         acutPrintf(_T("\nSheet名称:%s\n"),SheetName);
  909.         //得到全部Cells,此时,range是cells的集合
  910.         range.AttachDispatch(sheet.get_Cells());
  911.        
  912.         int rowhight,colwide;
  913.         CString cstr;
  914.         TableLine tableline;
  915.         //表格信息二维数组
  916.        
  917.         AcGePoint3d RowStartPoint = ptInsert;
  918.         AcGePoint3d ColStartPoint;
  919.         for(long i=StartRow;i<StartRow+row_num;i++)
  920.         {
  921.                 vector<TextInfo>Vectortextinfo;
  922.                 AcGePoint3d ptRowCurren = RowStartPoint;
  923.                 for(long j=StartCol;j<StartCol+col_num;j++)
  924.                 {
  925.                         TextInfo textinfo;
  926. //                         _tcscpy_s(textinfo.SheetName,SheetName);
  927. //                         _tcscpy_s(textinfo.BookName,BookName);
  928.                         AcGePoint3d ptColCurren = ColStartPoint;
  929.                         //读取单元格文本
  930.                         iCell.AttachDispatch(range.get_Item (COleVariant(i),COleVariant(j)).pdispVal );
  931.                         RangeRow.AttachDispatch(iCell.get_EntireRow());
  932.                         COleVariant hReasult = RangeRow.get_Hidden();
  933.                         if (hReasult.boolVal == VARIANT_TRUE)
  934.                                 break;
  935.                         RangeCol.AttachDispatch(iCell.get_EntireColumn());
  936.                         hReasult = RangeCol.get_Hidden();
  937.                         if (hReasult.boolVal == VARIANT_TRUE)
  938.                                 continue;
  939.                         //获取单元格的对齐方式
  940.                         hReasult.lVal=0;
  941.                         hReasult=iCell.get_HorizontalAlignment();
  942.                         if(hReasult.lVal!=0)
  943.                         {
  944.                                 switch (hReasult.lVal)
  945.                                 {
  946.                                 case 1:      //默认
  947.                                         {
  948.                                                 textinfo.HorizontalAlignment =Aligndefault;
  949.                                                 break;
  950.                                         }
  951.                                 case -4108:  //居中
  952.                                         {
  953.                                                 textinfo.HorizontalAlignment = AlignCenter;
  954.                                                 break;
  955.                                         }
  956.                                        
  957.                                 case -4131 : //靠左
  958.                                         {
  959.                                                 textinfo.HorizontalAlignment = Alignleft;
  960.                                                 break;
  961.                                         }
  962.                                        
  963.                                 case -4152 : //靠右
  964.                                         {
  965.                                                 textinfo.HorizontalAlignment = AlignRight;
  966.                                                 break;
  967.                                         }
  968.                                 }
  969.                         }
  970.                         //获取单元格所处的行号列号和文字
  971.                         textinfo.RowNum = i;
  972.                         textinfo.ColNum = j;
  973.                         vResult =iCell.get_Text();
  974.                         cstr=vResult.bstrVal;
  975.                         _tcscpy(textinfo.text,cstr);
  976.                         //获取单元格字体
  977.                         Font0 = iCell.get_Font();
  978.                         COleVariant varFontInfo;
  979.                         //字体高度
  980.                         varFontInfo = Font0.get_Size();
  981.                         textinfo.texthight = abs(varFontInfo.dblVal * Scale * 0.7);
  982.                         //单元格行高列宽
  983.                         COleVariant Var=iCell.get_RowHeight();
  984.                         //行高
  985.                         textinfo.rowheiht=Var.dblVal * Scale;
  986.                         Var=iCell.get_ColumnWidth();
  987.                         //列宽
  988.                         textinfo.colwidth = Var.dblVal * 5 * Scale;
  989.                         vResult = iCell.get_MergeCells();
  990.                         if (vResult.boolVal == -1)
  991.                         {        //是合并单元格
  992.                                 textinfo.IsMergeCells = true;
  993.                                 UnionRanges.AttachDispatch(iCell.get_MergeArea());
  994.                                 //合并单元格的行数
  995.                                 UnionRange.AttachDispatch(UnionRanges.get_Rows());
  996.                                 textinfo.UnionRowNums = UnionRange.get_Count();
  997.                                 //合并单元格的列数
  998.                                 UnionRange.AttachDispatch(UnionRanges.get_Columns());
  999.                                 textinfo.UnionColNums = UnionRange.get_Count();
  1000.                                 //合并单元格的起始行列号
  1001.                                 textinfo.UnionStartRowNum = UnionRanges.get_Row();
  1002.                                 textinfo.UnionStartColNum = UnionRanges.get_Column();
  1003.                                 //合并单元格的行判断
  1004.                                 if (textinfo.UnionRowNums >1)
  1005.                                 {
  1006.                                         if (textinfo.RowNum == textinfo.UnionStartRowNum)
  1007.                                         {        //如果当前单元格的行是合并单元格第一行
  1008.                                                 textinfo.IsTop = true;
  1009.                                                 textinfo.IsBottom = false;
  1010.                                                 textinfo.LUPoint = ptRowCurren;
  1011.                                                 textinfo.RUPoint = textinfo.LUPoint;
  1012.                                                 textinfo.RUPoint.x += textinfo.colwidth;
  1013.                                         }
  1014.                                         else if(textinfo.RowNum == textinfo.UnionStartRowNum + textinfo.UnionRowNums-1)
  1015.                                         {        //如果当前单元格的行是合并单元格最后一行
  1016.                                                 textinfo.IsBottom = true;
  1017.                                                 textinfo.IsTop = false;
  1018.                                                 textinfo.LBPoint = ptRowCurren;
  1019.                                                 textinfo.LBPoint.y -= textinfo.rowheiht;
  1020.                                                 textinfo.RBPoint = textinfo.LBPoint;
  1021.                                                 textinfo.RBPoint.x += textinfo.colwidth;
  1022.                                         }
  1023.                                         else
  1024.                                         {        //如果当前单元格的行不是合并单元格第一行也不是最后一行
  1025.                                                 textinfo.IsBottom = false;
  1026.                                                 textinfo.IsTop = false;
  1027.                                         }
  1028.                                 }
  1029.                                 else
  1030.                                 {
  1031.                                         textinfo.IsBottom = true;
  1032.                                         textinfo.IsTop = true;
  1033.                                         textinfo.LUPoint = ptRowCurren;
  1034.                                         textinfo.RUPoint = textinfo.LUPoint;
  1035.                                         textinfo.RUPoint.x += textinfo.colwidth;
  1036.                                         textinfo.LBPoint = textinfo.LUPoint;
  1037.                                         textinfo.LBPoint.y -= textinfo.rowheiht;
  1038.                                         textinfo.RBPoint = textinfo.LBPoint;
  1039.                                         textinfo.RBPoint.x += textinfo.colwidth;
  1040.                                 }
  1041.                                 //合并单元格的列判断
  1042.                                 if (textinfo.UnionColNums>1)
  1043.                                 {
  1044.                                         if (textinfo.ColNum == textinfo.UnionStartColNum)
  1045.                                         {        //如果当前单元格的行是合并单元格第一列
  1046.                                                 textinfo.IsLeft = true;
  1047.                                                 textinfo.IsRight = false;
  1048.                                                 textinfo.LUPoint = ptRowCurren;
  1049.                                                 textinfo.LBPoint = textinfo.LUPoint;
  1050.                                                 textinfo.LBPoint.y -= textinfo.rowheiht;
  1051.                                         }
  1052.                                         else if(textinfo.ColNum == textinfo.UnionStartColNum + textinfo.UnionColNums-1)
  1053.                                         {        //如果当前单元格的行是合并单元格最后一列
  1054.                                                 textinfo.IsRight = true;
  1055.                                                 textinfo.IsLeft = false;
  1056.                                                 textinfo.RUPoint = ptRowCurren;
  1057.                                                 textinfo.RUPoint.x += textinfo.colwidth;
  1058.                                                 textinfo.RBPoint = textinfo.RUPoint;
  1059.                                                 textinfo.RBPoint.y -= textinfo.rowheiht;
  1060.                                         }
  1061.                                         else
  1062.                                         {        //如果当前单元格的行不是合并单元格第一行也不是最后一行
  1063.                                                 textinfo.IsRight = false;
  1064.                                                 textinfo.IsLeft = false;
  1065.                                         }
  1066.                                 }
  1067.                                 else
  1068.                                 {
  1069.                                         textinfo.IsLeft = true;
  1070.                                         textinfo.IsRight = true;
  1071.                                         textinfo.LUPoint = ptRowCurren;
  1072.                                         textinfo.LBPoint = textinfo.LUPoint;
  1073.                                         textinfo.LBPoint.y -= textinfo.rowheiht;
  1074.                                         textinfo.RUPoint = textinfo.LUPoint;
  1075.                                         textinfo.RUPoint.x += textinfo.colwidth;
  1076.                                         textinfo.RBPoint = textinfo.RUPoint;
  1077.                                         textinfo.RBPoint.y -= textinfo.rowheiht;
  1078.                                 }
  1079.                         }
  1080.                         else
  1081.                         {        //不是合并单元格
  1082.                                 textinfo.IsMergeCells = false;
  1083.                                 textinfo.IsBottom = true;
  1084.                                 textinfo.IsTop= true;
  1085.                                 textinfo.IsLeft = true;
  1086.                                 textinfo.IsRight = true;
  1087.                                 textinfo.LUPoint = ptRowCurren;
  1088.                                 textinfo.RUPoint = textinfo.LUPoint;
  1089.                                 textinfo.RUPoint.x += textinfo.colwidth;
  1090.                                 textinfo.LBPoint = textinfo.LUPoint;
  1091.                                 textinfo.LBPoint.y -= textinfo.rowheiht;
  1092.                                 textinfo.RBPoint = textinfo.LBPoint;
  1093.                                 textinfo.RBPoint.x += textinfo.colwidth;
  1094.                         }
  1095.                         Vectortextinfo.push_back(textinfo);
  1096.                         ptRowCurren.x += textinfo.colwidth;
  1097.                 }
  1098.                 if (!Vectortextinfo.empty())
  1099.                 {
  1100.                         VectorTableinfo.push_back(Vectortextinfo);
  1101.                         RowStartPoint.y -= Vectortextinfo.back().rowheiht;
  1102.                 }
  1103.         }
  1104.        
  1105.         //释放Dispatch
  1106.         iCell.ReleaseDispatch ();
  1107.         range.ReleaseDispatch ();
  1108.         ranges.ReleaseDispatch();
  1109.         RangeRow.ReleaseDispatch();
  1110.         RangeCol.ReleaseDispatch();
  1111.         UnionRanges.ReleaseDispatch();
  1112.         UnionRange.ReleaseDispatch();
  1113.         sheet.ReleaseDispatch ();
  1114.         sheets.ReleaseDispatch ();
  1115.         book.ReleaseDispatch ();
  1116.         books.ReleaseDispatch ();
  1117.         Font0.ReleaseDispatch();
  1118.         app.ReleaseDispatch ();

  1119.         //行表格线列表
  1120.         //行表格线列表
  1121.        
  1122.        
  1123.         vector<list<TableLine>>lRow;
  1124.         vector<list<TableLine>>lCol;
  1125.         AcGePoint3d StartPoint = ptInsert;
  1126.         AcGePoint2d ptlu,ptrb;
  1127.         ptlu.x = ptInsert.x;
  1128.         ptlu.y=ptInsert.y;
  1129.         TextInfo * TextInfoArry = new TextInfo[VectorTableinfo.size() * VectorTableinfo[0].size()+1];
  1130.         int number =1;
  1131.         TextInfoArry[0].RowNum = VectorTableinfo.size() * VectorTableinfo[0].size();
  1132.         BookName.Append(_T(","));
  1133.         BookName.Append(SheetName);
  1134.         BookName.Append(_T(","));
  1135.         BookName.Append(Caption);
  1136.         _tcscpy(TextInfoArry[0].text,BookName);
  1137.         TextInfoArry[0].RowNum=row_num;
  1138.         TextInfoArry[0].ColNum=col_num;
  1139.         TextInfoArry[0].UnionStartRowNum =StartRow;
  1140.         TextInfoArry[0].UnionStartColNum=StartCol;
  1141.         for (int i = 0;i < VectorTableinfo.size();i++)
  1142.         {
  1143.                 vector<TextInfo>Vectortextinfo = VectorTableinfo[i];
  1144.                 list<TableLine> ListTableRowline;
  1145.                 bool iscontinue = false;
  1146.                 TableLine RowTableLine;
  1147.                 for (int j = 0;j<Vectortextinfo.size();j++)
  1148.                 {
  1149.                        
  1150.                         TextInfo textinfo = Vectortextinfo[j];
  1151.                         list<TableLine> ListTableColline;
  1152.                         TableLine RowTableLine,ColTableLine;
  1153.                         if (i > 0)
  1154.                         {        //第一行顶线不用判断
  1155.                                 if (textinfo.IsMergeCells)
  1156.                                 {        //是合并单元格
  1157.                                         if (textinfo.IsTop)
  1158.                                         {
  1159.                                                 if (ListTableRowline.empty() || iscontinue)
  1160.                                                 {
  1161.                                                         RowTableLine.TopStartPoint=textinfo.LUPoint;
  1162.                                                         RowTableLine.TopEndPoint = textinfo.RUPoint;
  1163.                                                         ListTableRowline.push_back(RowTableLine);
  1164.                                                         iscontinue = false;
  1165.                                                 }
  1166.                                                 else
  1167.                                                 {
  1168.                                                         ListTableRowline.back().TopEndPoint=textinfo.RUPoint;
  1169.                                                 }
  1170.                                         }
  1171.                                         else
  1172.                                         {
  1173.                                                 iscontinue =true;
  1174.                                         }

  1175.                                 }
  1176.                                 else
  1177.                                 {        //不是合并单元格
  1178.                                         if (ListTableRowline.empty()|| iscontinue)
  1179.                                         {
  1180.                                                 RowTableLine.TopStartPoint=textinfo.LUPoint;
  1181.                                                 RowTableLine.TopEndPoint = textinfo.RUPoint;
  1182.                                                 ListTableRowline.push_back(RowTableLine);
  1183.                                         }
  1184.                                         else
  1185.                                         {
  1186.                                                 ListTableRowline.back().TopEndPoint=textinfo.RUPoint;
  1187.                                         }
  1188.                                 }
  1189.                         }
  1190.                         //列向竖线
  1191.                         if (j>0)
  1192.                         {
  1193.                                 if (textinfo.IsMergeCells)
  1194.                                 {
  1195.                                         //是合并单元格
  1196.                                         if (textinfo.IsLeft)
  1197.                                         {        //单元格有左线
  1198.                                                 if (i == 0)
  1199.                                                 {
  1200.                                                         //当前单元格未创建左线链表
  1201.                                                         ColTableLine.TopStartPoint=textinfo.LUPoint;
  1202.                                                         ColTableLine.BottomEndPoint=textinfo.LBPoint;
  1203.                                                         ColTableLine.IsColcontinue = true;
  1204.                                                         ListTableColline.push_back(ColTableLine);
  1205.                                                         lCol.push_back(ListTableColline);
  1206.                                                 }
  1207.                                                 else
  1208.                                                 {        //当前单元格已创建左线链表
  1209.                                                         if (lCol[j-1].back().IsColcontinue)
  1210.                                                         {        //上段线连续
  1211.                                                                 lCol[j-1].back().BottomEndPoint=textinfo.LBPoint;
  1212.                                                                
  1213.                                                         }
  1214.                                                         else
  1215.                                                         {        //上段线不连续
  1216.                                                                 ColTableLine.TopStartPoint=textinfo.LUPoint;
  1217.                                                                 ColTableLine.BottomEndPoint=textinfo.LBPoint;
  1218.                                                                 ColTableLine.IsColcontinue = true;
  1219.                                                                 lCol[j-1].push_back(ColTableLine);
  1220.                                                                
  1221.                                                         }

  1222.                                                 }
  1223.                                         }
  1224.                                         else
  1225.                                         {
  1226.                                                 if (i == 0)
  1227.                                                 {
  1228.                                                         //当前单元格未创建左线链表
  1229.                                                        
  1230.                                                         ColTableLine.TopStartPoint=AcGePoint3d(0,0,0);
  1231.                                                         ColTableLine.BottomEndPoint=AcGePoint3d(0,0,0);
  1232.                                                         ColTableLine.IsColcontinue = false;
  1233.                                                         ListTableColline.push_back(ColTableLine);
  1234.                                                         lCol.push_back(ListTableColline);
  1235.                                                 }
  1236.                                                 if (j<lCol.size())
  1237.                                                 {
  1238. //                                                        CreateLine(lCol[i].back().TopStartPoint,lCol[i].back().BottomEndPoint);
  1239.                                                         lCol[j-1].back().IsColcontinue = false;
  1240.                                                 }

  1241.                                         }
  1242.                                 }
  1243.                                 else
  1244.                                 {//不是合并单元格
  1245.                                         if (i == 0)
  1246.                                         {
  1247.                                                 //当前单元格未创建左线链表
  1248.                                                 ColTableLine.TopStartPoint=textinfo.LUPoint;
  1249.                                                 ColTableLine.BottomEndPoint=textinfo.LBPoint;
  1250.                                                 ColTableLine.IsColcontinue = true;
  1251.                                                 ListTableColline.push_back(ColTableLine);
  1252.                                                 lCol.push_back(ListTableColline);
  1253.                                         }
  1254.                                         else
  1255.                                         {        //当前单元格已创建左线链表
  1256.                                                 if (lCol[j-1].back().IsColcontinue)
  1257.                                                 {        //上段线连续
  1258.                                                         lCol[j-1].back().BottomEndPoint=textinfo.LBPoint;

  1259.                                                 }
  1260.                                                 else
  1261.                                                 {        //上段线不连续
  1262.                                                         ColTableLine.TopStartPoint=textinfo.LUPoint;
  1263.                                                         ColTableLine.BottomEndPoint=textinfo.LBPoint;
  1264.                                                         ColTableLine.IsColcontinue = true;
  1265.                                                         lCol[j-1].push_back(ColTableLine);

  1266.                                                 }
  1267.                                         }
  1268.                                 }
  1269.                         }
  1270.                         //表的右下角点
  1271.                         if (i+1 == VectorTableinfo.size() && j+1 == Vectortextinfo.size())
  1272.                         {
  1273.                                 ptrb.x = textinfo.RBPoint.x;
  1274.                                 ptrb.y = textinfo.RBPoint.y;
  1275.                         }
  1276.                         //向CAD中写字
  1277.                         if (_tcscmp(textinfo.text,_T("")) != 0)
  1278.                         {
  1279.                                 if (textinfo.IsMergeCells)
  1280.                                 {
  1281.                                         if (textinfo.ColNum == textinfo.UnionStartColNum && textinfo.RowNum == textinfo.UnionStartRowNum)
  1282.                                         {
  1283.                                                 AcGePoint3d InsertPt1 =textinfo.LUPoint;
  1284.                                                 AcGePoint3d InsertPt2 = VectorTableinfo[i + textinfo.UnionRowNums-1][j + textinfo.UnionColNums-1].RBPoint;
  1285.                                                 textinfo.RBPoint = InsertPt2;
  1286. //                                                AcGePoint3d InsertPoint =CCalculation::MiddlePoint(InsertPt1,InsertPt2);
  1287.                                                 AcDbObjectId Obj = CreateMText(InsertPt1,InsertPt2,textinfo.text,AcDbObjectId::kNull,textinfo.texthight,textinfo.HorizontalAlignment,ptInsert,Caption,BookName,SheetName,StartRow,StartCol,row_num,col_num);
  1288.                                                 if (Obj != NULL)
  1289.                                                 {
  1290.                                                         textinfo.Objectid = Obj;
  1291. //                                                         AcDbText* pEntity;
  1292. //                                                         if(acdbOpenObject(pEntity,Obj,AcDb::kForRead) == Acad::eOk)
  1293. //                                                         {
  1294. //                                                                 AcGePoint3d position;
  1295. //                                                                 position = pEntity->position();
  1296. //                                                                 position = pEntity->alignmentPoint();
  1297. //                                                                 pEntity->close();
  1298. //                                                         }
  1299.                                                 }
  1300.                                         }
  1301.                                 }
  1302.                                 else
  1303.                                 {
  1304. //                                        AcGePoint3d InsertPoint =CCalculation::MiddlePoint(textinfo.LUPoint,textinfo.RBPoint);
  1305.                                         AcDbObjectId Obj = CreateMText(textinfo.LUPoint,textinfo.RBPoint,textinfo.text,AcDbObjectId::kNull,textinfo.texthight,textinfo.HorizontalAlignment,ptInsert,Caption,BookName,SheetName,StartRow,StartCol,row_num,col_num);
  1306.                                         if (Obj != NULL)
  1307.                                         {
  1308.                                                 textinfo.Objectid = Obj;
  1309.                                         }
  1310.                                 }
  1311.                         }
  1312.                         else
  1313.                         {        //如果单元格为空
  1314.                                 if (textinfo.IsMergeCells)
  1315.                                 {        //单元格为合并单元格
  1316.                                         if (textinfo.ColNum == textinfo.UnionStartColNum && textinfo.RowNum == textinfo.UnionStartRowNum)
  1317.                                         {        //设置第一个合并单元格左上角和右下角的坐标
  1318.                                                 AcGePoint3d InsertPt1 =textinfo.LUPoint;
  1319.                                                 AcGePoint3d InsertPt2 = VectorTableinfo[i + textinfo.UnionRowNums-1][j + textinfo.UnionColNums-1].RBPoint;
  1320.                                                 textinfo.RBPoint = InsertPt2;
  1321.                                         }
  1322.                                 }
  1323.                         }
  1324.                         TextInfoArry[number]=textinfo;
  1325.                         number++;
  1326.                 }
  1327.                 lRow.push_back(ListTableRowline);
  1328.                 ListTableRowline.clear();
  1329.         }
  1330.         //画列线
  1331.         for (int i =0;i<lCol.size();i++)
  1332.         {
  1333.                 list<TableLine> ListTableColline = lCol[i];
  1334.                 list<TableLine>::const_iterator Iterator;
  1335.                 for (Iterator=ListTableColline.begin();Iterator != ListTableColline.end();Iterator++)
  1336.                 {

  1337.                         if (Iterator->TopStartPoint != Iterator->BottomEndPoint)
  1338.                         {
  1339.                                 CreateLine(Iterator->TopStartPoint,Iterator->BottomEndPoint);
  1340.                         }
  1341.                 }
  1342.         }
  1343.         //画行线
  1344.         for (int i =0;i<lRow.size();i++)
  1345.         {
  1346.                 list<TableLine> ListTableRowline = lRow[i];
  1347.                 list<TableLine>::const_iterator Iterator;
  1348.                 for (Iterator=ListTableRowline.begin();Iterator != ListTableRowline.end();Iterator++)
  1349.                 {
  1350.                         if (Iterator->TopStartPoint != Iterator->BottomEndPoint)
  1351.                         {
  1352.                                 CreateLine(Iterator->TopStartPoint,Iterator->TopEndPoint);
  1353.                         }
  1354.                 }
  1355.         }
  1356.         CreateRectangle(ptlu,ptrb,0);
  1357.         LPVOID lpParameter =(LPVOID)TextInfoArry;
  1358.         HANDLE hThreade = ::CreateThread(
  1359.                 NULL,  // pointer to security attributes
  1360.                 NULL,                         // initial thread stack size
  1361.                 ThreadProc,     // pointer to thread function
  1362.                 lpParameter,                        // argument for new thread
  1363.                 NULL,                     // creation flags
  1364.                 NULL                         // pointer to receive thread ID
  1365.                 );
  1366.         ::CloseHandle(hThreade);
  1367.         if (!VectorTableinfo.empty())
  1368.         {
  1369.                 for (int i=0;i<VectorTableinfo.size();i++)
  1370.                 {
  1371.                         VectorTableinfo[i].clear();
  1372.                 }
  1373.                 VectorTableinfo.clear();
  1374.         }
  1375.         return RTNORM;
  1376. }

  1377. //-----------------------------------------------------------------------------
  1378. //----- ObjectARX EntryPoint
  1379. class CExcelApp : public AcRxArxApp {

  1380. public:
  1381.         CExcelApp () : AcRxArxApp () {}

  1382.         virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
  1383.                 // TODO: Load dependencies here

  1384.                 // You *must* call On_kInitAppMsg here
  1385.                 AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;
  1386.                
  1387.                 // TODO: Add your initialization code here

  1388.                 return (retCode) ;
  1389.         }

  1390.         virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {
  1391.                 // TODO: Add your code here

  1392.                 // You *must* call On_kUnloadAppMsg here
  1393.                 AcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt) ;

  1394.                 // TODO: Unload dependencies here

  1395.                 return (retCode) ;
  1396.         }

  1397.         virtual void RegisterServerComponents () {
  1398.         }


  1399.         // - YCLExcel.ReadExcel command (do not rename)
  1400.         static void YCLExcelReadExcel(void)
  1401.         {
  1402.                 // Add your code for command YCLExcel.ReadExcel here
  1403.                 IsExitThreade = true;
  1404.                 acutPrintf(_T("本插件由孤帆制作,仅供试用!用前请保存工作,CAD随时可能崩溃!\n"));
  1405.                 ads_real ScaleBak=1.0;
  1406.                 TCHAR str[30]={0};
  1407.                 TCHAR str1[10] = {0};
  1408.                 _tcscpy(str, _T("请输入生成表格的比例:<"));
  1409.                 _stprintf(str1,_T("%f"),Scale);
  1410.                 _tcscat(str,str1);
  1411.                 _tcscat(str,_T(">:"));
  1412.                 if (acedGetReal(str,&ScaleBak) == RTNORM)
  1413.                 {
  1414.                         Scale = ScaleBak;
  1415.                 }
  1416.                 ads_point pt;
  1417.                 if(acedGetPoint(NULL,_T("请拾取插入点:\n"),pt)!= RTNORM)
  1418.                         return;
  1419.                 ptInsert.x=pt[0];
  1420.                 ptInsert.y=pt[1];
  1421.                 ptInsert.z=pt[2];
  1422.                 IsExitThreade = false;
  1423.                 DynamicReadFromExcel() ;
  1424.         }

  1425.         // - YCLExcel.WriteExcel command (do not rename)
  1426.         static void YCLExcelWriteExcel(void)
  1427.         {
  1428.                 // Add your code for command YCLExcel.WriteExcel here

  1429.                 DynamicWriteToExcel();
  1430.         }

  1431. //         // - YCLExcel.ReAccess command (do not rename)
  1432. //         static void YCLExcelReAccess(void)
  1433. //         {
  1434. //                 // Add your code for command YCLExcel.ReAccess here
  1435. //                 IsExitThreade = true;
  1436. //                 CString Caption,BookName,SheetName;
  1437. //                 int Start_Row,Start_Col,Row_Nums,Col_Nums;
  1438. //                 AcGePoint3d pt;
  1439. //                 struct resbuf *rb; // 结果缓冲区链表
  1440. //                 ads_name ssname;
  1441. //                 rb = acutBuildList(RTDXF0, _T("MTEXT"),    // 实体类型
  1442. //                         RTNONE);
  1443. //                 // 选择复合要求的文字
  1444. //                 if(acedSSGet(NULL,NULL,NULL,rb,ssname) != RTNORM)
  1445. //                 {
  1446. //                         acutRelRb(rb);
  1447. //                         AfxMessageBox(_T("选择对象失败!"));
  1448. //                         return;
  1449. //                 }
  1450. //                 long sslength;
  1451. //                 acedSSLength(ssname, &sslength);
  1452. //                 acutRelRb(rb);
  1453. //                 bool IsXData = false;
  1454. //                 for(int i = 0;i < sslength;i++)
  1455. //                 {
  1456. //                         ads_name ent;
  1457. //                         AcDbObjectId objId;
  1458. //                         acedSSName(ssname, i, ent);
  1459. //                         acdbGetObjectId(objId, ent);
  1460. //                         AcDbEntity *pEnt;
  1461. //                         if(acdbOpenAcDbEntity(pEnt, objId, AcDb::kForRead) == Acad::eOk)
  1462. //                         {
  1463. //                                 struct resbuf  *pXData,*pTemp;
  1464. //                                 pXData = pEnt->xData(_T("ReadeEXCEL"));
  1465. //                                 pEnt->close();
  1466. //                                 if (pXData != NULL)     // 如果已经包含扩展数据,就不再添加新的扩展数据
  1467. //                                 {
  1468. //                                         pTemp = pXData->rbnext;
  1469. //                                         Caption = pTemp->resval.rstring;
  1470. //                                         pTemp = pTemp->rbnext;
  1471. //                                         BookName = pTemp->resval.rstring;
  1472. //                                         pTemp = pTemp->rbnext;
  1473. //                                         SheetName = pTemp->resval.rstring;
  1474. //                                         pTemp = pTemp->rbnext;
  1475. //                                         Start_Row = pTemp->resval.rint;
  1476. //                                         pTemp = pTemp->rbnext;
  1477. //                                         Start_Col = pTemp->resval.rint;
  1478. //                                         pTemp = pTemp->rbnext;
  1479. //                                         Row_Nums = pTemp->resval.rint;
  1480. //                                         pTemp = pTemp->rbnext;
  1481. //                                         Col_Nums = pTemp->resval.rint;
  1482. //                                         pTemp = pTemp->rbnext;
  1483. //                                         pt.x = pTemp->resval.rpoint[X];
  1484. //                                         pt.y = pTemp->resval.rpoint[Y];
  1485. //                                         pt.z = pTemp->resval.rpoint[Z];
  1486. //                                         acutRelRb(pXData);
  1487. //                                         IsXData = true;
  1488. //                                         break;
  1489. //                                 }
  1490. //                         }
  1491. //                 }
  1492. //                 acedSSFree(ssname);
  1493. //                 if (IsXData)
  1494. //                 {
  1495. //                         ReReadeExcel(Caption,BookName,SheetName,Start_Row,Start_Col,Row_Nums,Col_Nums,pt);
  1496. //                 }
  1497. //                 else
  1498. //                 {
  1499. //                         AfxMessageBox(_T("未找到有效的扩展数据!"));
  1500. //                 }
  1501. //         }
  1502. } ;

  1503. //-----------------------------------------------------------------------------
  1504. IMPLEMENT_ARX_ENTRYPOINT(CExcelApp)

  1505. ACED_ARXCOMMAND_ENTRY_AUTO(CExcelApp, YCLExcel, ReadExcel, ReadExcel, ACRX_CMD_TRANSPARENT, NULL)
  1506. ACED_ARXCOMMAND_ENTRY_AUTO(CExcelApp, YCLExcel, WriteExcel, WriteExcel, ACRX_CMD_TRANSPARENT, NULL)
  1507. //ACED_ARXCOMMAND_ENTRY_AUTO(CExcelApp, YCLExcel, ReAccess, ReAccess, ACRX_CMD_TRANSPARENT, NULL)
 楼主| 发表于 2017-8-18 15:00:17 | 显示全部楼层
mikewolf2k 发表于 2017-8-18 09:00
从技术的角度来说,很不错。从实用的角度来说,华而不实。

说的是,只是练一下多线程,确实不怎么实用。后面可以用对话框外建线程处理,这样对话框本身就可以不死了
发表于 2017-8-1 16:41:51 | 显示全部楼层
多线程?高级技术,怎么实现的,学习一下。
发表于 2017-8-13 07:53:59 | 显示全部楼层
留个脚印,我能用到这个
发表于 2017-8-13 10:10:20 | 显示全部楼层
这个不错,顶一个,不知道支持2018不
发表于 2017-8-13 16:48:36 | 显示全部楼层
这个厉害,支持一个
发表于 2017-8-13 19:13:55 | 显示全部楼层
有权限设置,下载不了:Q
发表于 2017-8-14 10:47:30 | 显示全部楼层
留个脚印,我能用到这个
发表于 2017-8-16 17:20:01 | 显示全部楼层
学习多线程
发表于 2017-8-17 17:42:14 | 显示全部楼层
很好的材料,学习学习
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 19:21 , Processed in 0.228888 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表