精华内容
下载资源
问答
  • Visual C#操作Excel编程超级详细
  • Excel VBA(Visual Basic)编程入门

    千次阅读 2020-05-30 13:20:08
    Visual Basic for Applications(VBA),是依附在应用程序(例如Excel)中的VB语言。只要你安装了Office Excel就自动默认安装了VBA,同样Word和PowerPoint也能调用VBA软件进行二次开发而让一些特别复杂的操作...

    Visual Basic for Applications(VBA),是依附在应用程序(例如Excel)中的VB语言。只要你安装了Office Excel就自动默认安装了VBA,同样Word和PowerPoint也能调用VBA对软件进行二次开发而让一些特别复杂的操作“脚本化”。VBA是Excel的底层根本。作为程序员来讲,只有明白使用最底层的东西,使用起来才能随心所欲。

    一、VBA打开方式

    方式一:快捷键ALT+F11
    方式二:

    sheet 右击–>查看代码 可以进入编程界面
    在这里插入图片描述

    方式三:文件 - 选项 - 自定义功能区 - 勾选开发工具 -菜单栏点击 “开发工具”-Visual Basic

    在这里插入图片描述
    在这里插入图片描述
    进入下面的代码编辑页面
    在这里插入图片描述

    二、 写一个 Hello World

    大部分程序入门都会写一个代码输出“Hello World”,我们写第一个程序在选定的单元格输出自己的昵称。

    1、新建模块

    模块方便我们导出代码用于其他的Excel,所以养成良好的编程习惯插入模块
    在这里插入图片描述

    2、 在指定区域编写代码
    Sub class()
    	Dim name
        name = "Hello World"
        MsgBox name    
    End Sub
    
    
    

    在这里插入图片描述

    三、注释

    注释有2种形式,一种是Rem;一种是 (单引号),注释不影响代码执行

    Sub class()
    	Rem 这是注释
        '这是第二种类注释
    	'定义一个变量
        Dim name
        name = "清平乐"
        MsgBox name
    End Sub
    

    在这里插入图片描述

    四、调用"立即窗口" 和 “本地窗口”

    1.在工具栏中选择视图—>立即窗口,和本地窗口。
    可以理解为打印台

    Sub class()
        Rem variant是任意类型
        Dim name As Variant
        name = "Hello World"
        Rem debug
        Debug.Print name
        name = "清平乐"
        Debug.Print name
        Rem 定义常量
        Const num As Integer = 123
        Debug.Print num
        
    End Sub
    

    )

    2.debug显示
    Sub class()
        Dim name
        name = "Hello World"
        Debug.Print name
        name = "清平乐"
        MsgBox name
        Debug.Print name
    End Sub
    

    在这里插入图片描述

    五、数据类型

    variant 代表任意类型

    single double decimal 代表 小数、

    rem 代表注释关键字

    Const 常量关键字

    在这里插入图片描述
    在这里插入图片描述

    六、分支语句

    IF分支

    Sub score()
    Dim 定义一个变量初始值
    Number = 90
    If Number >= 90 Then
       Debug.Print "优秀"
    ElseIf Number >= 80 Then
       Debug.Print "良好"
    Else
      Debug.Print "一般"
    End If
    End Sub
    

    <>

    Sub class3()
    Dim number As String
    number = "匹配"
    If number > "匹配" Then
       Debug.Print "优秀"
    ElseIf number <> "匹配" Then
       Debug.Print "良好"
    End If
    End Sub
    

    switch case

    
    Sub class4()
        Dim number As String
        number = "匹配"
        Select Case number
          Case "匹配"
            Debug.Print "匹配"
          Case "不匹配"
            Debug.Print "不匹配"
        End Select
            
    End Sub
    

    七、循环语句

    1.For 循环
    Sub class()
    Rem 演示for 循环
    Dim count As Integer
        For count = 1 To 10
            Debug.Print count
        Next
            Debug.Print "count 循环结束之后的值是 " & count
    End Sub
    
    
    2.do while
    Sub class()
        Rem do while 演示
        Dim count As Integer
        count = 20
        Do While count > 10
            Debug.Print count
            count = count - 1
            Debug.Print count
        Loop
        
        Rem do .. loop 条件 不演示了
         Do        
        Loop While count > 10
        
    End Sub
    

    在这里插入图片描述

    3.退出循环

    (1)退出for 循环—— exit for

    Sub class1()
        Dim count As Integer
        For count = 1 To 10
            If count = 5 Then
                Debug.Print "count 退出循环的值是: " & count
                Exit For
            End If
            Debug.Print count
        Next
    End Sub
    

    在这里插入图片描述
    (2)退出do while 循环——exit do

    Sub class1()
        Dim count As Integer
        Do While True
            count = count + 1
            If count > 5 Then
                Debug.Print "此时退出循环的值是: " & count
                Exit Do
            End If
        Loop
    End Sub
    

    在这里插入图片描述

    八、操作单元格

    两种方式,一种是range,一种是cells
    range
    在这里插入图片描述
    cells
    在这里插入图片描述

    展开全文
  • 使用自动化输出Excel查询表编程实例锦集,C++.net源代码编写,VisualStudio.net
  • EXCEL小数据量导入

    本方法缺点:数据量有一定的限制,若列数据过多,则只能导入2000条左右。此方法必须对表格中的列进行类声明。

    1.get:

     public virtual async Task<ActionResult> ImportStudentMessage(int page = 1)
            {
                return View(await db.StudentInforms.GetPagedDataAsyns(new PageDataParameter<StudentInform, Guid>(page: page)));
            }
    ``

    2.视图页面

    @using (Html.BeginForm("ImportStudentMessage", "StudentInforms", FormMethod.Post, new { enctype = "multipart/form-data" }))
    {
        <div form-group>
            <div class="row">
                <div class="clearfix">
                    <div class="col-xs-4">
                        <div class="pull-left">
                        <input name="file" type="file" class="form-control" accept=".xls,.xlsx" />
                            </div>
                        <div class="pull-right">
                        <input type="submit" value="导入" class="btn btn-success btn-sm" />
                        @Html.ValidationMessage("file", "", new { @class = "text-danger" })
                            </div>
                    </div>
                </div>
            </div>
        </div>
    }

    3.post方法

    [HttpPost]
            //[Authorize]
            public virtual ActionResult ImportStudentMessage(string file, bool stopWhenError = false)
            {
                if (Request.Files.Count > 0)
                {
                    if (Request.Files[0].ContentLength > 0)
                    {
                        string contentType = Request.Files[0].ContentType;
                        Guid fileId = Guid.NewGuid();
                        string path = Server.MapPath("\\Uploads");
                        string fileNameWithoutPath = System.IO.Path.GetFileName(Request.Files[0].FileName);
                        string fileName = fileId.ToString().Replace("-", "") + fileNameWithoutPath;
                        fileName = System.IO.Path.Combine(path, fileName);
                        try
                        {
                            Request.Files[0].SaveAs(fileName);
                            int rows = ImportStudentsFile1(fileName, stopWhenError);
                        }
                        catch (Exception ex)
                        {
                            ModelState.AddModelError("", "导入时发生错误,可能是文件格式非法,请将文件打开后另存为Excel2007以上的格式或联系管理员");
                        }
                    }
                    else
                        ModelState.AddModelError("", "请选择导入文件");
                }
                else {
                    ModelState.AddModelError("", "请选择导入文件");
                }
                //return View(db.StudentInforms.ToList());
                return RedirectToAction("Index");
            }

    4.ImportStudentsFile1()方法

     private int ImportStudentsFile1(string fileName, bool stopWhenError = false)
            {
                string[] data = { "考生号", "姓名", "身份证号", "性别代码", "民族代码", "政治面貌代码", "院校代码", "分校名称", "学历代码", "专业代码", "专业方向", "培养方式代码", "定向或委培单位", "生源所在地", "城乡生源", "学制", "入学时间", "毕业时间", "师范生类别代码", "困难生类别代码", "所在院系", "所在班级", "学号", "出生日期", "入学前档案所在单位", "入学前户口所在地派出所", "档案是否转入学校", "户口是否转入学校", "手机号码", "电子邮箱", "QQ号码", "家庭住址", "家庭电话", "家庭邮编", "毕业去向代码", "单位名称", "单位性质代码", "单位行业代码", "单位所在地", "工作职位类别代码", "单位联系人", "联系人电话", "联系人手机", "联系人电子邮箱", "联系人传真", "单位地址", "单位邮编", "报到证签发类别代码", "报到证签往单位名称", "签往单位所在地", "报到证编号", "报到起始时间", "档案转寄单位名称", "档案转寄单位地址", "档案转寄单位邮编", "户口迁转地址","协议书号", "档案所在地", "档案邮寄地址" };
                string[] property = { "No", "Name", "IDNumber", "SexCode", "NationCode", "PoliticalStatusCode", "CollegeCode", "BranchCollege", "DegreeCode", "MajorCode", "MajorField", "CultivationModeCode", "DirectionalUnit", "BirthPlaceCode", "StudentsFromUrbanAndRural", "EducationalSystem", "TermBeginTime", "GraduateTime", "NormalSchoolStudentTypeCode", "PoorStudentTypeCode", "Academy", "Class", "StudentNo", "Birthday", "BeforeEnrolRecordUnit", "BeforeEnrolResidenceLocationPolice", "RecordIsIntoSchool", "ResidenceIsIntoSchool", "Phone", "Email", "QQNumber", "Address", "HomePhone", "HomePostcode", "GraduateWhereaboutsCode", "UnitName", "UnitPropertyCode", "UnitIndustryCode", "UnitPlaceCode", "JobPositionType", "UnitContacts", "ContactPhone", "ContactTelephone", "ContactEmail", "ContactFax", "UnitAddress", "UnitPostcode", "ReportCardIssueTypeCode", "ReportCardToIssueUnitName", "ToIssueUnitPlaceCode", "ReportCardNo", "ReportStartTime", "RecordRedirectUnitName", "RecordRedirectUnitAddress", "RecordRedirectUnitPostcode", "ResidenceMovePlace", "ProtocolId", "Archives", "Postaddress" };
                return Import(fileName, data, property);
            }

    5.Import()方法

     private int Import(string fileName, string[] data, string[] property)
            {
                System.Data.OleDb.OleDbConnectionStringBuilder stringBuilder = new System.Data.OleDb.OleDbConnectionStringBuilder();
                stringBuilder.DataSource = fileName;
                stringBuilder.Provider = "Microsoft.ACE.OLEDB.12.0";
                stringBuilder.Add("Extended Properties", "Excel 12.0 Xml;HDR=YES");
                int rows = 0;
                using (System.Data.OleDb.OleDbConnection connection = new System.Data.OleDb.OleDbConnection(stringBuilder.ConnectionString))
                {
                    connection.Open();
                    DataTable table = connection.GetSchema("tables", new string[] { null, null, null, "TABLE" });
                    if (table.Rows.Count == 0)
                        throw new Exception("未找到导入数据");
                    string tableName = table.Rows[0]["TABLE_NAME"].ToString();
                    string sql = string.Format("SELECT * FROM [{0}]", tableName);
                    System.Data.OleDb.OleDbCommand command = new System.Data.OleDb.OleDbCommand(sql, connection);
                    using (var reader = command.ExecuteReader())
                    {
                        int[] dadaFielIndex = new int[data.Length];
    
                        for (int i = 0; i < data.Length; i++)
                        {
                            dadaFielIndex[i] = reader.GetOrdinal(data[i]);
                        }
                        if (dadaFielIndex[1] < 0) throw new Exception("未找到“姓名”列");
                        if (dadaFielIndex[2] < 0) throw new Exception("未找到“身份证号”列");
                        while (reader.Read())
                        {
                            string[] dataInformation = new string[dadaFielIndex.Length];
                            for (int i = 0; i < dadaFielIndex.Length; i++)
                            {
                                dataInformation[i] = reader[dadaFielIndex[i]].ToString().Trim();
                            }
                            string idNumber = reader["身份证号"].ToString().Trim();
                            int count = db.StudentInforms.Where(s => s.IDNumber == idNumber).Count();
                            StudentInform studentInformation = null;
                            if (count > 0)
                            {
                                studentInformation = db.StudentInforms.Where(s => s.IDNumber == idNumber).FirstOrDefault();
                                //stopWhenError = true;
                                //if (stopWhenError)
                                //    throw new Exception(string.Format("身份证“{0}”已经存在", idNumber));
                                //else
                                //    continue;
                            }
                            if (studentInformation == null)
                                studentInformation = new StudentInform();
                            Type t = typeof(StudentInform);
    
                            //string names = String.Join("\",\"", t.GetProperties().Select(w => w.Name));
                            for (int i = 0; i < property.Length; i++)
                            {
                                PropertyInfo propertyInfo = t.GetProperty(property[i]);
                                if (propertyInfo.PropertyType == typeof(DateTime))
                                {
                                    DateTime time;
                                    if (dataInformation[i].Length == 8)
                                    {
                                        time = DateTime.ParseExact(dataInformation[i], "yyyyMMdd", System.Globalization.CultureInfo.CurrentCulture);
                                    }
                                    else
                                    if (dataInformation[i].Length == 6)
                                    {
                                        time = DateTime.ParseExact(dataInformation[i] + "01", "yyyyMMdd", System.Globalization.CultureInfo.CurrentCulture);
                                    }
                                    else
                                    {
                                        time = DateTime.Now;
                                    }
    
                                    propertyInfo.SetValue(studentInformation, time, null);
                                }
                                else if (propertyInfo.PropertyType == typeof(bool))
                                {
                                    propertyInfo.SetValue(studentInformation, false, null);
                                }
                                //else if (i == 57)
                                //{
                                //    propertyInfo.SetValue(studentInformation, common.encryptPassWord(dataInformation[2].Substring(12, 6)), null);
                                //}
                                else
                                    propertyInfo.SetValue(studentInformation, dataInformation[i], null);
                            }
                            //循环赋值 
                            //foreach (var item in t.GetProperties())
                            //{
                            //    item.SetValue(studentInformation, dataInformation[j], null);
                            //    j++;
                            //}
                            //单独赋值 
                            if (count == 0)
                            {
                                t.GetProperty("Id").SetValue(studentInformation, Guid.NewGuid(), null);
                                studentInformation.Password = common.encryptPassWord(studentInformation.IDNumber.Substring(12, 6));
                                studentInformation.PasswordStatus = false;
                                db.StudentInforms.Add(studentInformation);
                            }
                            db.SaveChanges();
                            rows++;
                        }
                        reader.Close();
                    }
                    connection.Close();
                }
                return rows;
            }
    展开全文
  • VS2010操作Excel编程

    2017-07-25 09:03:53
    通过VC实现对Excel表格的操作的方法有多种,如:通过ODBC数据库实现,通过解析Excel表格文件,通过OLE/COM的实现。...Microsoft Visual Studio 2010 Microsoft Office Excel 20071、添加OLE/COM支持。 首先,应

    通过VC实现对Excel表格的操作的方法有多种,如:通过ODBC数据库实现,通过解析Excel表格文件,通过OLE/COM的实现。本文主要研究通过OLE/COM实现对Excel表格的操作。

    本文源码的应用环境说明:
    Windows XP SP3
    Microsoft Visual Studio 2010
    Microsoft Office Excel 2007

    1、添加OLE/COM支持。
    首先,应用程序必须添加对OLE/COM的支持,才能导入OLE/COM组件。
    本文使用的是MFC对话框程序,在创建工程的向导中选中Automation选项即可为程序自动添加相应的头文件和OLE库初始化代码。
    通过查看源代码,可以知道在stdafx.h的头文件中,添加了OLE/COM很多类所需添加的头文件。

    include

    #import "D:\Program Files\Microsoft Office\Office12\EXCEL.EXE" no_namespace

    这行代码的作用是导入Excel整个类型库到工程中。
    由VS2010自动产生的导入代码存在以下几个问题:
    (1)如果导入了多个接口,每个头文件都会把类型库导入一次,如果引用多个头文件,会导致类型库重复导入。
    (2)Excel类型库中有些类型会跟MFC类库的某些类型冲突。
    (3)Excel类型库的某些类型跟其他Office和VB的某些库相关,如果不导入相关库,将导致这些类型无法使用。。
    以上三点问题的解决方法如下:
    (1)仅在_Application接口对应头文件中导入Excel类型库。
    (2)对冲突的类型进行重命名。
    (3)在导入Excel类型库之前,先导入Office和VB的相关库。
    更改后的导入类型库的代码如下:

    #import "C:\Program Files\Common Files\Microsoft Shared\OFFICE12\MSO.DLL"
    rename("RGB", "MSORGB")
    rename("DocumentProperties", "MSODocumentProperties")
    using namespace Office;
    #import "C:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXusing namespace VBIDE;
    #import "D:\Program Files\Microsoft Office\Office12\EXCEL.EXE"
    rename("DialogBox", "ExcelDialogBox")
    rename("RGB", "ExcelRGB")
    rename("CopyFile", "ExcelCopyFile")
    rename("ReplaceText", "ExcelReplaceText")
    no_auto_excludenamespace Excel;

    编译程序后,会在Debug或Release目录下生成三个文件mso.tlh、vbe6ext.tlh和excel.tlh。通过打开文件可知,该三个文件的命名空间分别是Office、VBIDE和Excel。导入了Excel的整个类型库后,就可以使用Excel中的所有类型了。

    4、操作Excel步骤
    操作Excel的主要步骤如下:
    (1)创建一个Excel应用程序。
    (2)得到Workbook的容器。
    (3)打开一个Workbook或者创建一个Workbook。
    (4)得到Workbook中的Worksheet的容器。
    (5)打开一个Worksheet或者创建一个WorkSheet。
    (6)通过Range对WorkSheet中的单元格进行读写操作。
    (7)保存Excel。
    (8)释放资源。

    5、批量处理Excel表格
    VC通过OLE/COM操作Excel,是通过进程间的组件技术。因此,每次读写Excel中的单元格时,都要进行进程间的切换。当数据量大,如果一个单元格一个单元格的读取,主要的时间都花费在进程切换中。因此读取多个单元格,将可有效的提高程序的运行效率。
    对多个单元格的读写操作可以通过CRange中以下两个成员函数来完成。
    VARIANT get_Value2();
    void put_Value2(VARIANT& newValue);
    其中,输入参数newValue只要输入一个二维数组,即可实现向Excel中一次写入多个单元格的值。
    其中,VARIANT中实现二维数据的方法可参考
    http://www.cnblogs.com/xianyunhe/archive/2011/09/13/2174703.html
    当然,在对CRange类进行操作之前,要设置CRange类对应的单元格。

    6、Excel表格的保存
    (1)如果要保存打开的工作簿,使用CWorkbook类的Save函数就可以保存工作簿,原文件将被覆盖。
    (2)如果是新创建的工作簿,或者是要另存为,可使用CWorkbook类的SaveAs函数。
    SaveAs的参数比较多。其中,第1个参数是设置要保存文件的路径;第2个参数是设置文件的格式,可在MSDN中查看枚举类型XlFileFormat来了解Excel的文件格式。经过测试,在本文所用的测试环境中,Excel2003的文件格式是xlExcel8,Excel2007的文件格式是xlExcel4。

    7、获取当前Excel的版本
    可以通过CApplication的get_Version函数来获得Excel的版本,其中,Excel2007的主版本号是12,Excel2003的主版本号是11。

    8、示例源代码
    主要代码如下:

    m_ListCtrl.SetExtendedStyle(LVS_REPORT | LVS_EX_FULLROWSELECT);
    
    CApplication ExcelApp;
    CWorkbooks books;
    CWorkbook book;
    CWorksheets sheets;
    CWorksheet sheet;
    CRange range;
    LPDISPATCH lpDisp = NULL;
    
    //创建Excel 服务器(启动Excel)
    if(!ExcelApp.CreateDispatch(_T("Excel.Application"),NULL))
    {
    AfxMessageBox(_T("启动Excel服务器失败!"));
    return -1;
    }
    
    CString strExcelVersion = ExcelApp.get_Version();
    int iStart = 0;
    strExcelVersion = strExcelVersion.Tokenize(_T("."), iStart);
    if (_T("11") == strExcelVersion)
    {
    AfxMessageBox(_T("当前Excel的版本是2003。"));
    }
    else if (_T("12") == strExcelVersion)
    {
    AfxMessageBox(_T("当前Excel的版本是2007。"));
    }
    else
    {
    AfxMessageBox(_T("当前Excel的版本是其他版本。"));
    }
    
    ExcelApp.put_Visible(TRUE);
    ExcelApp.put_UserControl(FALSE);
    
    books.AttachDispatch(ExcelApp.get_Workbooks());
    
    
    CString strBookPath = _T("C:\tmp.xls");
    try
    {
    
    lpDisp = books.Open(strBookPath, 
    vtMissing, vtMissing, vtMissing, vtMissing, vtMissing,
    vtMissing, vtMissing, vtMissing, vtMissing, vtMissing, 
    vtMissing, vtMissing, vtMissing, vtMissing);
    book.AttachDispatch(lpDisp);
    }
    catch(...)
    {
    
    lpDisp = books.Add(vtMissing);
    book.AttachDispatch(lpDisp);
    }
    
    sheets.AttachDispatch(book.get_Sheets());
    
    CString strSheetName = _T("NewSheet");
    try
    {
    lpDisp = sheets.get_Item(_variant_t(strSheetName));
    sheet.AttachDispatch(lpDisp);
    }
    catch(...)
    {
    
    lpDisp = sheets.Add(vtMissing, vtMissing, _variant_t((long)1), vtMissing);
    sheet.AttachDispatch(lpDisp);
    sheet.put_Name(strSheetName);
    }
    
    system("pause");
    
    lpDisp = sheet.get_Range(_variant_t("A1"), _variant_t("J10"));
    range.AttachDispatch(lpDisp);
    
    VARTYPE vt = VT_I4; 
    SAFEARRAYBOUND sabWrite[2]; 
    sabWrite[0].cElements = 10;
    sabWrite[0].lLbound = 0;
    sabWrite[1].cElements = 10;
    sabWrite[1].lLbound = 0;
    
    COleSafeArray olesaWrite;
    olesaWrite.Create(vt, sizeof(sabWrite)/sizeof(SAFEARRAYBOUND), sabWrite);
    
    long (*pArray)[2] = NULL;
    olesaWrite.AccessData((void **)&pArray);
    memset(pArray, 0, sabWrite[0].cElements * sabWrite[1].cElements * sizeof(long));
    
    olesaWrite.UnaccessData();
    pArray = NULL;
    
    long index[2] = {0, 0};
    long lFirstLBound = 0;
    long lFirstUBound = 0;
    long lSecondLBound = 0;
    long lSecondUBound = 0;
    olesaWrite.GetLBound(1, &lFirstLBound);
    olesaWrite.GetUBound(1, &lFirstUBound);
    olesaWrite.GetLBound(2, &lSecondLBound);
    olesaWrite.GetUBound(2, &lSecondUBound);
    for (long i = lFirstLBound; i <= lFirstUBound; i++)
    {
    index[0] = i;
    for (long j = lSecondLBound; j <= lSecondUBound; j++)
    {
    index[1] = j;
    long lElement = i * sabWrite[1].cElements + j; 
    olesaWrite.PutElement(index, &lElement);
    }
    }
    
    VARIANT varWrite = (VARIANT)olesaWrite;
    range.put_Value2(varWrite);
    
    system("pause");
    
    CString strSaveAsName = _T("C:\new.xlsx");
    CString strSuffix = strSaveAsName.Mid(strSaveAsName.ReverseFind(_T('.')));
    XlFileFormat NewFileFormat = xlOpenXMLWorkbook;
    if (0 == strSuffix.CompareNoCase(_T(".xls")))
    {
    NewFileFormat = xlExcel8;
    }
    book.SaveAs(_variant_t(strSaveAsName), _variant_t((long)NewFileFormat), vtMissing, vtMissing, vtMissing, 
    vtMissing, 0, vtMissing, vtMissing, vtMissing, 
    vtMissing, vtMissing);
    
    system("pause");
    
    
    VARIANT varRead = range.get_Value2();
    COleSafeArray olesaRead(varRead);
    
    VARIANT varItem;
    CString strItem;
    lFirstLBound = 0;
    lFirstUBound = 0;
    lSecondLBound = 0;
    lSecondUBound = 0;
    olesaRead.GetLBound(1, &lFirstLBound);
    olesaRead.GetUBound(1, &lFirstUBound);
    olesaRead.GetLBound(2, &lSecondLBound);
    olesaRead.GetUBound(2, &lSecondUBound);
    memset(index, 0, 2 * sizeof(long));
    m_ListCtrl.InsertColumn(0, _T(""), 0, 100);
    for (long j = lSecondLBound; j<= lSecondUBound; j++)
    {
    CString strColName = _T("");
    strColName.Format(_T("%d"), j);
    m_ListCtrl.InsertColumn(j, strColName, 0, 100);
    }
    for (long i = lFirstLBound; i <= lFirstUBound; i++)
    {
    CString strRowName = _T("");
    strRowName.Format(_T("%d"), i);
    m_ListCtrl.InsertItem(i-1, strRowName);
    
    index[0] = i;
    for (long j = lSecondLBound; j <= lSecondUBound; j++)
    {
    index[1] = j;
    olesaRead.GetElement(index, &varItem);
    
    switch (varItem.vt)
    {
    case VT_R8:
    {
    strItem.Format(_T("%d"), (int)varItem.dblVal);
    }
    
    case VT_BSTR:
    {
    strItem = varItem.bstrVal;
    }
    
    case VT_I4:
    {
    strItem.Format(_T("%ld"), (int)varItem.lVal);
    }
    
    default:
    {
    
    }
    }
    
    m_ListCtrl.SetItemText(i-1, j, strItem);
    }
    }
    sheet.ReleaseDispatch();
    sheets.ReleaseDispatch();
    book.ReleaseDispatch();
    books.ReleaseDispatch();
    ExcelApp.Quit();
    ExcelApp.ReleaseDispatch();

    示例源代码的工程文件的下载链接如下:
    http://files.cnblogs.com/xianyunhe/ReadWriteExcel.rar

    参考资料
    (1)http://www.cnblogs.com/xianyunhe/archive/2011/09/13/2174703.html
    (2)http://hfp0601.blog.163.com/blog/static/228483522011031104718762/
    (3)http://www.cppblog.com/sleepwom/archive/2009/10/03/97804.html
    (4)http://www.rondebruin.nl/saveas.htm

    展开全文
  • Excel应该是我们在日常工作中非常常用的一个效率工具,那么如果想要扩展Excel更多的业务功能,可以在VS开发环境中为Excel开发VSTO扩展程序,这样就可以借助微软为我们开放的操作Excel的接口,在Office的功能区添加...

    为Excel开发VSTO扩展程序

    Excel应该是我们在日常工作中非常常用的一个效率工具,那么如果想要扩展Excel更多的业务功能,可以在VS开发环境中为Excel开发VSTO扩展程序,这样就可以借助微软为我们开放的操作Excel的接口,在Office的功能区添加选项卡、控件后完成一些我们所需的任何业务功能:
    在这里插入图片描述

    新建Excel VSTO外接程序

    1. 在VS中新建一个Excel扩展应用程序,如果没有找到这个选项,去红框里的VS安装程序中勾选Office开发选项即可(我使用的VS版本是2015、2017)
      在这里插入图片描述

    2. ThisAddIn. cs就是VSTO扩展程序的主入口,它提供了很多回调事件给我们使用

      在这里插入图片描述

    3. 在新建项目的解决方案中点击右键为Excel工程创建功能区,这个功能区就是Excel VSTO外界程序的用户界面
      在这里插入图片描述

    • 很简单的,工程建立完毕

    基础的名称空间与抽象类型

    了解两个常用的库

    在VSTO的开发当中,会经常用到两个库:

    using Microsoft.Office.Interop.Excel;
    using Microsoft.Office.Tools.Excel;
    

    其中:

    • Interop.Excel名称空间
      • 一个微软提供给我们的访问Excel的COM接口,它最大的用处就是:利用它可以直接对Windows版本的Excel中的内容进行读写,例如:
        • 获取Excel中的所有工作表
        • 获取\修改Excel中的单元格
        • 新增一个worksheet页
        • 等等
    • Tools.Excel名称空间
      • 是一个用于扩展支持Office Excel对象模型的类库,利用它可以将.NET的其他组件与Excel配合在一起实现一些功能,例如:
        • 利用ListObject接口可以将DataTable实例与Excel的worksheet表进行关联的操作
        • 利用Chart接口可以为Excel的sheet添加一个图表

    了解Excel开发中的抽象类型

    • 1、Application

      在VSTO程序中,Application接口代表了整个Excel应用程序

    • 2、WorkSheet

      WorkSheet对象是WorkSheets对象集的成员,是Excel中的sheet页的抽象

    • 3、Range

      Range对象就是对Excel中每一个单元格的抽象,或者是包含一个或多个单元格块的选定区域(这个区域可以是连续的也可以是不连续的)

    以上这三个元素就是Excel在VSTO变成当中,最常用到的三个抽象接口

    基本操作

    在Excel工程中,在ThisAddIn文件中和项目的其他文件中,读写Excel元素的方式是不同的

    • 在ThisAddIn. cs文件中,访问Excel中的元素,直接用Application访问即可:
    using Excel = Microsoft.Office.Interop.Excel;
    
    Excel.Worksheet activeWorksheet = ((Excel.Worksheet)Application.ActiveSheet);
    Excel.Range firstRow = activeWorksheet.get_Range("A1");
    
    • 但是在非ThisAddIn .cs文件当中,比如新建功能区的按钮事件,若想访问Excel元素,则必须在前边加上Globals.ThisAddIn才能够正常访问
    • 由于在一般情况下,是根本不会在主程序中去做业务操作的,所以以后所有基本操作的例子,我都会按照非主程序的访问方式给出:
    using Microsoft.Office.Tools.Ribbon;
    using Microsoft.Office.Interop.Excel;
    using ExcelTools = Microsoft.Office.Tools;
    
    // worksheet级别的操作:
    Worksheet wst = ((Worksheet)Globals.ThisAddIn.Application.ActiveSheet);                     // 获取当前选中的Sheet页;
    Worksheet wst2 = ((Worksheet)Globals.ThisAddIn.Application.Worksheets["考核情况"]);         // 根据名称获取Sheet页;
    
    // 新建worksheet
    Worksheet new_wst;
    new_wst = (Worksheet)Globals.ThisAddIn.Application.Worksheets.Add();
    new_wst.Name = "新建Sheet页";
    
    int rowsCount = wst.UsedRange.Rows.Count;                                                   //获取已经使用的行
    int colsCount = wst.UsedRange.Columns.Count;                                                //获取已经使用的列
    
    var content = wst2.Range["A1"].Value;                                                       // 获取表中单元格内容
    ((Range)wst.Range["A8"]).Value = "111";                                                     // 写入单元格数据
    
    ((Range)wst2.Rows[2, Type.Missing]).Delete(XlDeleteShiftDirection.xlShiftToLeft);           // 删除某一行
    ((Range)wst2.Cells[1, 2]).EntireColumn.Delete(0);                                           // 删除某一列
    
    // 取出这个表所有的列
    // 如果不用UsedRange的话,就会获取到Excel包含空白的所有列
    List<string> all_column = new List<string>();
    foreach (Range all_col in wst2.UsedRange.Columns)
    {
        all_column.Add(all_col.Value2[1, 1]);
    }
    
    // 获取当前Excel表的所有表名;
    List<string> m_AllSheets = new List<string>();
    foreach (var sheetlist in Globals.ThisAddIn.Application.Worksheets)
    {
        m_AllSheets.Add(((Worksheet)sheetlist).Name);
    }
    
    

    Excel的扩展控件

    微软为Excel提供了几个比较有用的扩展控件,能够帮助Excel完成更多的扩展功能,例如:

    • 为worksheet添加表格并绑定数据源
    • 为worksheet添加图表并绑定数据源
    • 等等,即如下图所示:

    在这里插入图片描述

    1、使用ObjectList扩展控件为Excel表格并绑定数据源

    以上说明的所有操作都是对Excel中的每一个单一元素进行操作,但是,如果要是有一个数据源,需要和某一个Excel中的WorkSheet进行关联,这个就是ListObject的作用。ListObject控件支持简单和复杂的数据绑定,最简单的,比如:比如绑定一个内存中DataTable数据源

    使用实例1:将一个DataTable绑定到ObjectList

    在利用VSTO编程在Excel的WorkSheet中添加ListObject和在Excel中添加了一个表格是一样的,在Excel中的操作如下:

    在这里插入图片描述

    在VSTO利用代码开发,效果也是同样的:

    using Microsoft.Office.Tools.Ribbon;
    using Microsoft.Office.Interop.Excel;
    using ExcelTools = Microsoft.Office.Tools;
    
    
    string connectionString = "此处是连接数据库的字符串";
    
    // 添加一个ListObject到WorkSheet;
    ExcelTools.Excel.Worksheet worksheet = Globals.Factory.GetVstoObject(wst);
    ExcelTools.Excel.ListObject list1;
    Range cell = worksheet.Range["$A$1:$Z$9999"];
    list1 = worksheet.Controls.AddListObject(cell, "list1");
    list1.AutoSetDataBoundColumnHeaders = true;
    
    // 通过OleDB查询;
    using (OleDbConnection con = new OleDbConnection(connectionString))
    {
        var dataTable = new System.Data.DataTable();
        string query = SQL_Generator.GenerateSQLByTemplate(column);
        con.Open();
        OleDbDataAdapter adapter = new OleDbDataAdapter(query, con);
    
        adapter.Fill(dataTable);
        ds.Tables.Add(dataTable);
        con.Close();
    
        list1.SetDataBinding(dataTable, null, sheetnames);
    }
    

    使用实例2、使用Chart扩展控件为Excel添加图表

    在这里插入图片描述

    using Microsoft.Office.Tools.Ribbon;
    using Microsoft.Office.Interop.Excel;
    using ExcelTools = Microsoft.Office.Tools;
    
    
    ExcelTools.Excel.Worksheet worksheet = Globals.Factory.GetVstoObject(
        Globals.ThisAddIn.Application.ActiveWorkbook.ActiveSheet);
    
    
    Range cells = worksheet.Range["A5", "D8"];
    ExcelTools.Excel.Chart chart = worksheet.Controls.AddChart(cells, "employees");
    chart.ChartType = XlChartType.xl3DPie;
    chart.SetSourceData(cells);
    
    展开全文
  • 详细讲课了Visual Studio 2008提供了很多控件用于开发Windows应用程序,在本章中将介绍每一个控件的常用属性、方法、事件及其具体应用。同时,部分实例将界面设计和代码编写结合起来,开发出具有一定功能的Windows...
  • Microsoft Visual Basic for Applications (VBA) 是近几...本文许多解决方案重构问题进行了分析,这些问题是您在使用 Visual Basic 语言将 VBA 解决方案重构到 Visual Studio 2005 Tools for Office 时可能会遇到的。
  • Visual Studio 2010:Office 编程

    千次阅读 2012-02-02 10:03:25
    1. 从Start | All Programs | Microsoft Visual Studio 2010 | Microsoft Visual Studio 2010 打开Microsoft Visual Studio 2010。 2. 在Microsoft Visual Studio 初始页面, 单击New Project 图标。  注意...
  • 导读:编程,实际上范围还是很广的,有简单的PLC也算编程Excel表格还自带VB,有复杂的系统插件,;我们说电脑配置,还是要落实到应用程序或者开发程序上面来,不能泛泛而谈;1、我们聊聊编码的大众逻辑下的那些...
  • Visual Studio 2019 发行说明

    千次阅读 2019-05-14 11:37:48
    原文:...有关如何安装和更新 Visual Studio 2019 的说明,请参阅将 Visual Studio 2019 更新到最新版本。另请参阅如何脱机安装的说明。 Visu...
  • 最近在研究Office编程,发现了这个领域也是非常非常的有趣,而且,市场也是大大的有.今天遇到的一个课题是:用VS2008编写一个COM组件,并在Excel中用VBA...[Com Class],则不需要定义接口,可以直接类进行编程,这个类是...
  • VS2010 对Excel读写操作

    万次阅读 2017-08-10 21:52:30
    VS2010对Excel读写操作、基本实现对Excel的读写
  • 1. 从 Start | All Programs | Microsoft Visual Studio 2010 | Microsoft Visual Studio 2010 打开 Microsoft Visual Studio 2010。 2. 在 Microsoft Visual Studio 初始页面, 单击 New Project 图标。 注意...
  • 使用自动化运行Excel编程实例锦集,C++.net源代码编写,VisualStudio.net
  • 内容介绍:Microsoft Visual Studio 2008是IDE的最新版本,本书介绍了IDE的各个方面,包括常见的任务、复杂的函数、强大的工具、主代码编辑以及设计窗口。本书由两位资深专家编著,深入探讨了IDE强大的特性和技术,...
  • Visual Studio 环境中配置安装NPOI库

    千次阅读 2020-06-13 09:54:30
    Visual Studio 环境中配置安装NPOI库
  • 在VS2013平台上,使用MFC对话框编程,实现对excel表格数据的读写
  • 这是Visual C++编程实战宝典(清华出版社.李琳娜)一书的配套完整DVD光盘。该书以Visual Studio 2010作为开发环境,全书共分7篇,由浅入深,全面、系统地介绍了Visual C++开发的各项技术,是一本不可多得的必备参考...
  • In the previous article, Getting started with Visual Studio Code (VS Code), we took a detailed overview of the popular code editor. It supports various programming languages t-SQL, Python, PHP, AW...
  • Visual Basic 2008高级编程(第5 版) 3 .6 .1使用继承的场合................151 3 .6 .2继承和多接口................... 153 3 .6 .3多级继承...........................158 3.6.4 “ 脆弱”的基类问题........ ...
  • 使用 Visual Studio Tools for Office(VSTO)访问Excel数据表 这个方法不限于32位系统,64位系统也可以通过COM对象访问Excel,但要有Microsoft Office Object Library存在。在安装VS2008 过程中可以选择安装VSTO...
  • C# 使用Excel完整实例

    千次阅读 2019-11-11 18:07:29
    本人电脑环境:Window7 32位、Visual Studio Enterprise 2015、Microsoft Office2010 步骤一:在项目中添加引用 1、在[计算机] 中搜索Microsoft.Office.Interop.Excel.dll文件 >> 把该文件拷贝到代码目录...
  • VB.net 2019打开Excel表格

    2021-01-26 10:02:22
     Dim AppXls As Microsoft.Office.Interop.Excel.Application '声明Excel对象  Dim AppWokBook As Microsoft.Office.Interop.Excel.Workbook '声明工作簿对象  Dim AppSheet As New ...
  • VSTO(Visual Studio Tools for Office) 简介与部分资源整理
  • 做作业的时候查了一点儿资料, ...现在编程语言没话说! 1 项目-添加引用-COM-Microsoft Excel 12.0 Object Library && -Microsoft Office 12.0 Object Library 2 using Microsoft.Office.Core; u...
  • 第1章 visual studio 2010 3 1.1 visual studio 2010:从express到ultimate的各种版本 4 1.2 visual basic的关键字和语法 7 1.2.1 控制台应用程序 10 1.2.2 从项目模板上创建项目 11 1.2.3 solution ...
  • VS2010 C++ 操作Excel表格的编程实现 转载请注明原文网址: http://www.cnblogs.com/xianyunhe/archive/2011/09/25/2190485.html 通过VC实现对Excel表格的操作的方法有多种,如:通过ODBC数据库实现,通过解析...
  • Microsoft Developer Studio为大多数标准的数据库格式提供了32位ODBC驱动器。这些标准数据格式包括有:SQL Server、Access、Paradox、dBase、FoxPro、Excel、Oracle以及Microsoft Text。如果用户希望使用其他数据格式...
  • VS2015:在MFC下实现Excel文件读写操作

    千次阅读 2020-11-19 17:54:18
    visual studio 2015下使用MFC实现可视化编程,并对Excel文件进行读写操作 开发环境:Visual Studio 2015、Office2016(版本可以随意) 一、创建MFC项目 创建MFC测试demo,这里我直接创建一个基于对话框的MFC应用...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,589
精华内容 2,635
关键字:

studiovisual对excel编程