C \ # OLEDB 를 통 해 Excel 로 빅 데 이 터 를 내 보 냅 니 다.

5437 단어 Excel
C \ # Excel 로 데 이 터 를 내 보 내 는 방법 은 기본적으로 두 가지 가 있 습 니 다. 하 나 는 Microsoft. Office. Interop. Excel. Application 을 통 해 한 줄 한 줄 엑셀 에 기록 하 는 방법 입 니 다.또 다른 방법 은 OLEDB 를 통 해 DataSet 의 대량 업데이트 확 대 를 이용 하여 Excel 에 기록 하 는 것 이다.
        이 두 가지 방법 은 각각 쓸모 가 있다.Microsoft. Office. Interop. Excel. application 을 통 해 데 이 터 를 Excel 에 전송 하면 표 의 형식 을 직접 보고 인쇄 할 수 있 지만 효율 이 낮 습 니 다.OLEDB 를 통 해 Excel 에 데 이 터 를 전송 하면 형식 은 제어 하기 어렵 지만 효율 이 높다.
        제 가 최근 에 빅 데 이 터 를 내 보 낼 때 (750 w 사용자 데 이 터 를 도시 별로 내 보 냅 니 다. 모든 Excel 파일 은 하나의 sheet 만 있 고 그 중에서 최대 1000 개) Microsoft. Office. Interop. Excel. application 을 통 해 데 이 터 를 Excel 로 전송 하 는 데 성공 하지 못 했 습 니 다. 이런 방법 은 COM 을 통 해 데 이 터 를 전송 하 는 방법 에 메모리 방출 과 FrameWork 프레임 워 크 에 문제 가 있 습 니 다.나중에 올 레 드 비 를 통 해 내 보 내 는 데 성 공 했 습 니 다.
      1. 준비 작업: 디스크 에 모델 엑셀 파일 을 만 들 고 이 엑셀 파일 의 sheet 1 첫 줄 은 표 두 를 작성 합 니 다.
      2. 핵심 코드:
           2.1 도시 데 이 터 를 DataTable 로 추출 city Dt = "모든 도 시 를 id 로 정렬 합 니 다."
           2.2 파일 이 저 장 된 폴 더 fileOutFolder
          2.3. 나 는 데 이 터 를 다섯 대의 컴퓨터 에 나 누 어 내 보 냈 기 때문에 한 도시 의 분류 방법 이 있다.
           private void city(int cityMode)            {                    int cityRowNum = cityDt.Rows.Count;                    int cityColumnNum = cityDt.Columns.Count;                   for (int i = 0; i < cityRowNum; i++)                  {                          if (i % 5 == cityMode)  fileOutOleDb(i);                  }                              this.Close();            }
         2.4 내 보 낼 도시 의 사용자 기록 수 읽 기
          private int  findUserCount(int cityId)
         {
                  데이터베이스 데이터 읽 기
        }
        2.5 해당 페이지 를 읽 는 사용자 수
        private DataTable findUser(int cityId,int int skipNum)
        {
              return DataTable("select * from user where id="+cityId.toString()+" limit "+skipNum.tostring+",1000");
        }
       2.6. Excel 파일 내 보 내기 처리
 
        private void fileOutOleDb(int i)

        {

            int city_id = Convert.ToInt32(cityDt.Rows[i][0]);

            string city_ename = cityDt.Rows[i]["ename"].ToString();

            string city_name = cityDt.Rows[i]["ename"].ToString();

            int userCount = findUserCount(city_id);

            int pageCount = userCount / 1000;

            if (pageCount * 1000 < userCount) userCount += 1;

            int beginPageNo = 1;// Convert.ToInt32(textBox3.Text);

            int endPageNo = pageCount;// Convert.ToInt32(textBox4.Text);

            string curDirectory = fileOutFolder + "\\" + city_name;

            if (!Directory.Exists(curDirectory))

            {

                Directory.CreateDirectory(curDirectory);

            }



            for (int j = beginPageNo; j <= endPageNo; j++)

            {

                textBox2.Text = j.ToString();

                try

                {

                    //1、    

                    DataTable tempdt = findUser(Convert.ToInt32(cityDt.Rows[i][0]), j * 1000);

                    //        ,          

                    string fileFullName = curDirectory + "\\" + city_name + "_" + j.ToString() + ".xls";

                    if (!File.Exists(fileFullName))

                    {

                        File.Copy("d:\\model.xls", fileFullName);

                    }



                    //2、      

                    string strCon = string.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 12.0;HDR=YES;IMEX=0'", fileFullName);

                    OleDbConnection myConn = new OleDbConnection(strCon);

                    string strCom = "SELECT * FROM [Sheet1$]";

                    myConn.Open();

                    OleDbDataAdapter myDataAdapter = new OleDbDataAdapter(strCom, myConn);

                    DataSet myDataSet = new DataSet();

                    myDataAdapter.Fill(myDataSet, "[Sheet1$]");

                    myConn.Close();

                    DataTable dt = myDataSet.Tables[0]; //   DataTable  

                    dt.PrimaryKey = new DataColumn[] { dt.Columns["id"] };//     



                    int rowNum = tempdt.Rows.Count;

                    int colNum = tempdt.Columns.Count;

                    for (int k = 0; k < rowNum; k++)

                    {

                        DataRow myRow = dt.NewRow();

                        for (int m = 0; m < colNum; m++) myRow[m] = tempdt.Rows[k][m];

                        dt.Rows.Add(myRow);

                    }

                    OleDbCommandBuilder odcb = new OleDbCommandBuilder(myDataAdapter);

                    odcb.QuotePrefix = "[";   //    INSERT INTO        

                    odcb.QuoteSuffix = "]";



                    myDataAdapter.Update(myDataSet, "[Sheet1$]"); //         

                }

                catch

                {

                }

                if (j == pageCount) break;

                //System.Threading.Thread.Sleep(1000);

            }

        }

 
이 데 이 터 를 내 보 냅 니 다. 두 개의 병목 이 있 습 니 다. 하 나 는 데 이 터 를 읽 는 것 입 니 다. 하 나 는 한 도시 의 데이터 양 이 매우 많 습 니 다. 저 는 100 w 를 내 보 내 는 데 37 분 이 걸 립 니 다. 매우 빠 른 (20 개의 파일, 2W 정도) 내 보 내기 시 작 했 습 니 다. 뒤쪽 1 분 이면 2 개의 파일 이 있 습 니 다.
            
       

좋은 웹페이지 즐겨찾기