C \ # OLEDB 를 통 해 Excel 로 빅 데 이 터 를 내 보 냅 니 다.
5437 단어 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 개의 파일 이 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Excel Grep toolExcel Grep tool ■히나가타 ■ 시트 구성 ExcelGrep.cls...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.