问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何将excel中的数据导入到c语言中的数组中?

发布网友 发布时间:2022-04-21 01:06

我来回答

3个回答

懂视网 时间:2022-05-01 18:35

 1 public string OutputExceles(string strTitle, string FilePath, string typeName, System.Data.DataTable[] dtList, string[] smallTitleList) 
 2         {
 3             beforeTime = DateTime.Now;
 4             Excel.Application excel;
 5             Excel._Workbook xBk;
 6             Excel._Worksheet xSt;
 7             int rowIndex = 1;
 8             int colIndex = 1;
 9             excel = new Excel.ApplicationClass();
10             xBk = excel.Workbooks.Add(true);
11             xSt = (Excel._Worksheet)xBk.ActiveSheet;
12             int add=0;
13             foreach (System.Data.DataTable dt in dtList)
14             {
15                 colIndex = 1;               
16                 //取得整个报表的标题            
17                 excel.Cells[rowIndex , 1] = smallTitle[add];
18                 add++;
19                 ////设置整个报表的标题格式            
20                 xSt.get_Range(excel.Cells[rowIndex, 1], excel.Cells[rowIndex , dt.Columns.Count]).Font.Bold = true;
21                 xSt.get_Range(excel.Cells[rowIndex, 1], excel.Cells[rowIndex , dt.Columns.Count]).Font.Size = 22;
22                 ////设置整个报表的标题为跨列居中            
23                 xSt.get_Range(excel.Cells[rowIndex , 1], excel.Cells[rowIndex , dt.Columns.Count]).Select();
24                 xSt.get_Range(excel.Cells[rowIndex , 1], excel.Cells[rowIndex, dt.Columns.Count]).HorizontalAlignment = Excel.XlHAlign.xlHAlignCenterAcrossSelection;
25                 rowIndex++;
26                 foreach (DataColumn col in dt.Columns)
27                 {
28                     excel.Cells[rowIndex, colIndex] = col.ColumnName;
29                     //设置标题格式为居中对齐
30                     xSt.get_Range(excel.Cells[rowIndex, colIndex], excel.Cells[rowIndex, colIndex]).Font.Bold = true;
31                     xSt.get_Range(excel.Cells[rowIndex, colIndex], excel.Cells[rowIndex, colIndex]).HorizontalAlignment = Excel.XlVAlign.xlVAlignCenter;
32                     xSt.get_Range(excel.Cells[rowIndex, colIndex], excel.Cells[rowIndex, colIndex]).Select();
33                     xSt.get_Range(excel.Cells[rowIndex, colIndex], excel.Cells[rowIndex, colIndex]).Interior.ColorIndex = titleColorindex;
34                     colIndex++;
35                 }
36                 //取得表格中的数据            
37                 foreach (DataRow row in dt.Rows)
38                 {
39                     rowIndex++;
40                     colIndex = 1;
41                     foreach (DataColumn col in dt.Columns)
42                     {
43                         if (col.DataType == System.Type.GetType("System.DateTime"))
44                         {
45                             if (!string.IsNullOrEmpty(row[col.ColumnName].ToString()))
46                             {
47                                 excel.Cells[rowIndex, colIndex] = (Convert.ToDateTime(row[col.ColumnName].ToString())).ToString("yyyy-MM-dd");
48                                 xSt.get_Range(excel.Cells[rowIndex, colIndex], excel.Cells[rowIndex, colIndex]).HorizontalAlignment = Excel.XlVAlign.xlVAlignCenter;                           }
49                         }
50                         else if (col.DataType == System.Type.GetType("System.String"))
51                         {
52                             excel.Cells[rowIndex, colIndex] = "‘" + row[col.ColumnName].ToString();
53                             xSt.get_Range(excel.Cells[rowIndex, colIndex], excel.Cells[rowIndex, colIndex]).HorizontalAlignment = Excel.XlVAlign.xlVAlignCenter;r;                        }
54                         else
55                         {
56                             excel.Cells[rowIndex, colIndex] = row[col.ColumnName].ToString();
57                             xSt.get_Range(excel.Cells[rowIndex, colIndex], excel.Cells[rowIndex, colIndex]).HorizontalAlignment = Excel.XlVAlign.xlVAlignCenter;                        }
58                         colIndex++;
59                     }
60                 }
61                 rowIndex ++;
62             }
63             afterTime = DateTime.Now;
64             xSt.Name = strTitle;
65             string filename = typeName + DateTime.Now.ToString("yyyyMMdd") + ".xls";
66            // excel.Save(FilePath+filename);
67             excel.ActiveWorkbook.SaveCopyAs(FilePath + filename);          
68             #region  结束Excel进程
69             xBk.Close(null, null, null);
70             excel.Workbooks.Close();
71             excel.Quit();
72             #endregion
73             return filename;
74         }       技术分享

 

    方法四:采用DataGrid,GridView自带的属性。如下:

技术分享


(三)SSIS的简介
    SQL Server 2005 提供的一个集成化的商业智能开发平台,主要包括:   
  *SQL Server Analysis Services(SQL Server数据分析服务,简称SSAS)   
  *SQL Server Reporting Services(SQL Server报表服务,简称SSRS)   
  *SQL Server Integration Services(SQL Server数据集成服务,简称SSIS)

    SQL Server 2005 Integration Services (SSIS) 提供一系列支持业务应用程序开发的内置任务、容器、转换和数据适配器。可以创建 SSIS 解决方案来使用 ETL 和商业智能解决复杂的业务问题,管理 SQL Server 数据库以及在 SQL Server 实例之间复制 SQL Server 对象。
 
(四)数据库中存储过程示例(SSIS应用过程中需要的,最好拿个本子把需要的内容记下) 
    在SQL SERVER 2005中,以SSISDataBase数据库作为应用,仅包括2张表City,Province.(主要是为了简单,便于讲解)
技术分享

   

    其中存储过程如下:

技术分享 ALTER PROCEDURE [dbo].[ProvinceSelectedCityInfo]
(
@provinceId int=0

as
begin
select P.EName as 省份拼音,P.CName as 省份名,C.CName  as 城市名  from City C left join Province P
  on C.ProvinceId = P.ProvinceId
where  C.ProvinceId =@provinceId and @provinceId  is not null  or @provinceId is null or  @provinceId=0
end 技术分享

 

    其中,在这一步中我们必须要记住相关的内容,如上标识(红色);为什么这么做?主要是在制作SSIS包的时候很容易混淆,建议拿个本子把需要的内容写好。

  (五)Excel模板的制作(这步这么简单,稍微介绍一下)    因为SSIS中列映射对应的是Excel的标题,与数据是一对一的关系。先不管这么多,看下我们的模板,如下图所示。我们应该能够发现,省份拼音、省份名、城市名,还有ProvinceCityInfoExcel.xls,Sheet1都被笔者标识了,当然这一步与数据库中的存储过程取出的数据也是一对一的。(名称一致,可以减少很多不必要的麻烦,不然的话,嘿嘿....自己去想,那不是哥的事) 技术分享       等下,需要将创建的EXCEL模板放置到我们的项目文件目录中。(详见第七步)   (六)SSIS操作过程(生成Package,用来调用)
    这一步是最主要的过程,当然,也是很容易出错的一步。笔者会另外详细介绍制作Package包的过程,本文将直接将生成的包放到VS项目中进行运用。
    利用SQL Server 2005数据库自带的SQL Server Business Intelligence Development Studio(SQL Server商业智能开发平台),最终生成的项目如下图所示:
 技术分享     然后,将在SSIS项目中生成的Package.dtsx包复制到自己的项目文件目录中。这就是我们马上进入的步骤了---->(步骤七)   (七)C#中调用SSIS创建的Package和Excel模板(可以自己编写逻辑代码进行重复利用),用来生成Excel数据     先看下我们的VS2008项目,如下图所示: 技术分享       大家会发现,笔者将(五)(六)步骤生成的模板和Package包放置在项目中的“Excel导出”目录下,当然这些文件随便你放在哪里,这是不用再废话的,哈哈。     另外,笔者简单的设计了如下很粗糙的界面,目的是根据省份来显示城市的相关信息(其实大家都是很熟悉这些的,很多项目都是有省-市-县数据库表的),添加一个导出按钮,点击的时候,我们可以参考页面显示的内容和我们生成的客户端Excel中的内容是否一致。 技术分享       现在我们的重头戏开始了,如下代码(点击将触发的代码内容): 技术分享  1  protected void btnSSISSearch_Click(object sender, EventArgs e)
 2         {
 3             //构造sql语句  作为参数传递给数据包
 4             string sqlParams = Jasen.SSIS.Core.SsisToExcel.BuildSql("dbo.ProvinceSelectedCityInfo", "@provinceId", int.Parse(ddlProvice.SelectedValue));
 5             Jasen.SSIS.Core.SsisToExcel ssis = new Jasen.SSIS.Core.SsisToExcel();
 6             string rootPath = Request.PhysicalApplicationPath;
 7             string copyFilePath;
 8             //执行SSIS包的操作  生成EXCEL文件
 9             bool result = ssis.ExportDataBySsis(rootPath, sqlParams, out copyFilePath, "Package.dtsx", "ProviceCityInfoExcel.xls", "ProviceCityInfo");
10             if (result == false){
11                 if (System.IO.File.Exists(copyFilePath)) System.IO.File.Delete(copyFilePath); 
12             }
13             else
14             {
15                 ssis.DownloadFile(this, "ProviceCityInfoClientFile.xls", copyFilePath, true);
16             }
17         }    技术分享

   

    你肯定会说:“哥,你这个也太简单了吧?”。就是这么简单,不就是多写一个类给你调用就可以了吗。调用接口,这个你总会吧。不过你得了解各个参数才行。

    首先,我们必须引用2个DLL,Microsoft.SQLServer.ManagedDTS.dll和Microsoft.SqlServer.DTSPipelineWrap.dll(系统自带的)。先看下我们生成Excel文件数据的步骤,如下:

技术分享  /// <summary>
        /// 导出数据到EXCEL文件中
        /// </summary>
        /// <param name="rootPath"></param>
        /// <param name="sqlParams">执行包的传入参数</param>
        /// <param name="copyFile">生成的Excel的文件</param>
        /// <param name="packageName">SSIS包名称</param>
        /// <param name="execlFileName">SSIS EXCEL模板名称</param>
        /// <param name="createdExeclPreName">生成的Excel的文件前缀</param>
        /// <returns></returns>
        public bool ExportDataBySsis(string rootPath, string sqlParams, out string tempExcelName, string packageName, string execlFileName, string createdExeclPreName)
        {
            //数据包和EXCEL模板的存储路径
            string path =  rootPath + @"Excel导出";
            //强制生成目录
            if (!System.IO.Directory.Exists(path)) System.IO.Directory.CreateDirectory(path);
            //返回生成的文件名
            string copyFile = this.SaveAndCopyExcel(path, execlFileName, createdExeclPreName);
            tempExcelName = copyFile;
            //SSIS包路径
            string ssisFileName = path + packageName;
            //执行---把数据导入到Excel文件
            return ExecuteSsisDataToFile(ssisFileName, tempExcelName, sqlParams);
        } 技术分享

 

   

    代码注释如此清楚,想必也不需要再多做解释了吧,下面就是最最最重要的一步,需要看清楚了----->

技术分享  1    private bool ExecuteSsisDataToFile(string ssisFileName, string tempExcelName, string sqlParams)
 2         {
 3             Application app = new Application();
 4             Package package = new Package();
 5             //加载SSIS包           
 6             package = app.LoadPackage(ssisFileName, null);
 7             //获取 数据库连接字符串
 8             package.Connections["AdoConnection"].ConnectionString = Jasen.SSIS.Common.SystemConst.ConnectionString;
 9             //目标Excel属性
10             string excelDest = string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties="EXCEL 8.0;HDR=YES";", tempExcelName);
11             package.Connections["ExcelConnection"].ConnectionString = excelDest;
12             //给参数传值
13             Variables vars = package.Variables;
14             string str = vars["用户::SqlStr"].Value.ToString();
15             vars["用户::SqlStr"].Value = sqlParams;
16             //执行
17             DTSExecResult result = package.Execute();
18             if (result == DTSExecResult.Success){
19                 return true;
20             }
21             else{
22                 if (package.Errors.Count > 0){
23                     //在log中写出错误列表
24                     StringBuilder sb=new StringBuilder();
25                     for (int i = 0; i < package.Errors.Count; i++){
26                        sb.Append("Package error:" + package.Errors[i].Description +";");
27                     }
28                     throw new Exception(sb.ToString());
29                 }
30                 else{
31                      throw new Exception("SSIS Unknow error");
32                 }
33                 return false;
34             }
35         } 技术分享

 

      上面标注为红色的就是最重要的几个步骤了,相对来说,就是(1)加载包,(2)设置包的数据库连接串,(3)设置Excel的连接串,(4)设置参数变量,(5)执行操作  

      其次是如何巧妙的将Excel模板复制,使模板可以重复利用(当然也要注意将生成的文件下载到客户端后,将服务器上生成的Excel临时文件删除,你也可以写自己的算法进行清理不必要的Excel临时文件),如下代码所示,方法将复制模板,然后返回生成的临时文件的路径,如果需要删除该文件,System.IO.File.Delete(filePath)就可以删除文件了:

         讲了这么多,来看下我们点击后生成的效果, 技术分享       开始有点效果了,Excel终于可以下载到客户端了,我们保存该文件。我们是不是想核实一下,我们采用的SSIS方法来实现Excel数据导入是不是正确的,会不会生成错误的数据?     那我们看下下面的一张图,将它与上面的一张图比较一下,看下数据是不是一样的: 技术分享       发现生成的数据是一模一样的。我们是将数据导入到服务器上的临时EXCEL文件中,将文件发送到客户端肯定是不会出错的,除了你RP太差以外。RP差,任何事情都可能发生,嘿嘿。   (八)总结     在上面的示例中,由于数据量不是太多,你还感觉不到该方法的优势(效率高)。但是当数据量很大的时候,你用其他方法还在那里慢慢地等待excel文件生成的时候,该方法早就已经将数据导入到Excel中,并且发送到客户端了。有时候时间相差几十秒也是有可能的。数据量越大,效果越明显.....     接下来笔者将在另外一篇随笔中详细讲解SSIS package包的制作过程。这篇主要是SSIS应用篇。     希望各位能够在本随笔中有所收获。一口气写下来,还真不容易,写文章确实挺锻炼人的。当然,本文中肯定还有很多不足之处,希望各位多多指教。   本文源代码附上VS2008项目:Jasen.SSISProject.rar[VS2008精简版SSIS应用源代码]  相关SSIS资料:    

        效率最高的Excel数据导入---(c#调用SSIS Package将数据库数据导入到Excel文件中【附源代码下载】)
        效率最高的Excel数据导入续---SSIS Package包制作图解全过程

效率最高的Excel数据导入---(c#调用SSIS Package将数据库数据导入到Excel文件中【附源代码下载】) 转

标签:调用   关系   procedure   sum   idv   任务   pip   映射   private   

热心网友 时间:2022-05-01 15:43

简单的方法是通过ODBC来实现:
具体实现
一、 包含Excel文件操作类头文件
#include "CSpreadSheet.h"
二、 新建Excel文件,并写入默认数据
// 新建Excel文件名及路径,TestSheet为内部表名
CSpreadSheet SS("c:\\Test.xls", "TestSheet");
CStringArray sampleArray, testRow;
SS.BeginTransaction();
// 加入标题
sampleArray.RemoveAll();
sampleArray.Add("姓名");
sampleArray.Add("年龄");
SS.AddHeaders(sampleArray);
// 加入数据
CString strName[] = {"徐景周","徐志慧","郭徽","牛英俊","朱小鹏"};
CString strAge[] = {"27","23","28","27","26"};
for(int i = 0; i < sizeof(strName)/sizeof(CString); i++)
{
sampleArray.RemoveAll();
sampleArray.Add(strName[i]);
sampleArray.Add(strAge[i]);
SS.AddRow(sampleArray);
}

SS.Commit();
三、 读取Excel文件数据
CSpreadSheet SS("c:\\Test.xls", "TestSheet");
CStringArray Rows, Column;
//清空列表框
m_AccessList.ResetContent();
for (int i = 1; i <= SS.GetTotalRows(); i++)
{
// 读取一行
SS.ReadRow(Rows, i);
CString strContents = "";
for (int j = 1; j <= Rows.GetSize(); j++)
{
if(j == 1)
strContents = Rows.GetAt(j-1);
else
strContents = strContents + " --> " + Rows.GetAt(j-1);
}
m_AccessList.AddString(strContents);
}

热心网友 时间:2022-05-01 17:01

首先得把引用里将excel模块引用上
然后定义数组
将excel作为对象打开
对数组赋值
比如a(i,j)=cells(i,j)
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
大伙说说洗衣机要不要带烘干好 热烘干洗衣机怎么样 ef英语哪个好 EF英孚英语培训怎么样? 英孚英语好不好 EF英孚教育到底好不好 大佬们,麦芒7和荣耀10那个值得入手?2500以下的机子还有啥好推荐的么... 介绍几款2500元以前的手机 像素一定要高 其他的不做要求 近期想入手一部安卓手机,价格2200到2500左右…买HTC desire Z还是 三星... 笔记本忘记开机密码怎么办急死了 Excel中怎样在原有数据列中插入相同数据 Excel如何在隐藏的工作簿写入数据 怎么把excel的数据存入数据库里 代码怎么写 如何使用C#打开excel并将数据写入第i行第j列单元格,请高手指教! 通过用c语言一excel文档中读写数据 EXCEL在单元格内插入数据 如何用C语言读入和输出excel里的数据? vc++怎样从excel文件中读写数据 C语言如何操作excel文件? C语言中如何导入excel的数据 c语言得到的数据如何写入excel中或者txt中呢?下面的程序怎么写不进呢 C#如何在当前打开的Excel中写入数据? 相册怎么设置密码 苹果相册怎么设置密码? 光学测距机的原理是什么呢? 奇迹世界按键精灵脚本 奇迹世界挂机 怎么编写简单游的奇迹世界脚本 新奇迹世界2哪个职业最适合挂机 奇迹世界2内挂为什么打打就不走了 还有 在哪刷火AC 好 在EXCEL中如何使用宏将数据写入指定的表格 如何在excel一组数据中插入 怎样c语言读取并写入excel中的数据 如何用C语言实现读取excel文件中的数据呢? 如何将C语言的输出倒入Excel工作表 测距仪的主要特点是什么? 本人用超轻粘土做了个工艺品,可是要等它干要好长时间,如果放在桌子上会变形,求好人指点,放哪?? 超轻粘土的注意事项 超轻粘土成品如何储存? 超轻粘土怎么永久保存? 超轻粘土制作的人物能在常温下放多久? 被誉为中国能源之都的淮南,其能源储备到底有多丰富? 曹魏时期为什么会爆发淮南三叛 被称为中国最具幸福感城市,安徽淮南为何如此宜居? 淮南的实力究竟多强?真的强大到一定程度吗? 淮南怎么才能成为瑜伽教练 淮南怎么样 安徽省淮南市是个怎么样的城市呢? 淮南是13个特大城市为什么发展这么差 淮南的经济状况怎么样