Excel 시트 안에 표 객체에 행을 삽입하는 방법?
기존 테이블 개체에 행을 삽입하는 데 문제가 있습니다.다음은 제 코드 조각입니다.
string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + @"C:\myExcelFile.xlsx" + ";Extended Properties=\"Excel 12.0;ReadOnly=False;HDR=Yes;\"";
using (OleDbConnection conn = new OleDbConnection(connectionString))
{
conn.Open();
OleDbCommand cmd = new OleDbCommand();
cmd.Connection = conn;
string insertQuery = String.Format("Insert into [{0}$] (ID, Title,NTV_DB, Type ) values(7959, 8,'e','Type1')", TabDisplayName);
cmd.CommandText = insertQuery;
cmd.ExecuteNonQuery();
cmd = null;
conn.Close();
}
결과적으로 이미 만들어진 테이블 개체 아래에 행을 삽입합니다.
테이블 개체에 다음과 같은 데이터를 삽입해 보았습니다.
string insertQuery = String.Format("Insert into [{0}$].[MyTable] (ID, Title,NTV_DB, Type ) values(7959, 8,'e','Type1')", TabDisplayName);
하지만 오류가 발생합니다.
Microsoft Access 데이터베이스 엔진에서 'MyTable' 개체를 찾을 수 없습니다.개체가 존재하고 개체 이름과 경로 이름의 철자가 올바른지 확인합니다.'MyTable'이 로컬 개체가 아닌 경우 네트워크 연결을 확인하거나 서버 관리자에게 문의하십시오.
보다시피, 이름이 있는 테이블MyTable
존재합니다.누군가가 이 미스터리를 밝혀준다면 정말 감사하겠습니다.
사용 중인 경우Microsoft.ACE.OLEDB
지정된 범위를 지원하지 않습니다.시트의 이름을 제공해야 합니다.[Sheet1$]
또는 시트 이름 뒤에 범위가 표시됩니다.[Sheet1$A1:P7928]
범위가 제공되지 않으면 테이블이 사용된 범위로 정의되며, 빈 행이 포함될 수 있습니다.
빈 행을 처리하는 한 가지 방법은 해당 행을 삭제하는 것이지만 드라이버가 해당 행을 지원하지 않습니다.DELETE
작동.
다른 방법은 먼저 비어 있지 않은 행 수를 세는 것입니다.Id
그런 다음 결과를 사용하여 테이블의 범위를 정의합니다.INSERT
문:
using (OleDbConnection conn = new OleDbConnection(connectionString)) {
conn.Open();
string SheetName = "Sheet1";
string TableRange = "A1:P{0}";
// count the number of non empty rows
using (var cmd1 = new OleDbCommand(null, conn)) {
cmd1.CommandText = String.Format(
"SELECT COUNT(*) FROM [{0}$] WHERE ID IS NOT NULL;"
, SheetName);
TableRange = string.Format(TableRange, (int)cmd1.ExecuteScalar() + 1);
}
// insert a new record
using (var cmd2 = new OleDbCommand(null, conn)) {
cmd2.CommandText = String.Format(
"INSERT INTO [{0}${1}] (ID, Title, NTV_DB, Type) VALUES(7959, 8,'e','Type1');"
, SheetName, TableRange);
cmd2.ExecuteNonQuery();
}
}
이 코드를 실행하는 경우:
var contents = new DataTable();
using (OleDbDataAdapter adapter = new OleDbDataAdapter(string.Format("Select * From [{0}$]", TabDisplayName), conn))
{
adapter.Fill(contents);
}
Console.WriteLine(contents.Rows.Count);//7938
7938(스크린샷의 마지막 행 번호)이 표시됩니다.그리고 새 행을 삽입하면 7939 위치에 삽입됩니다.Excel은 마지막 번호가 7938임을 알고 있으므로 (7929, 7930, ...) 행의 빈 내용은 무시됩니다.
솔루션:
- 엑셀 파일에서 7928 이후의 모든 행을 삭제해야 합니다.
- 특정 위치에 삽입해야 합니다.
Access C#이 Excel과 동일하게 작동하는지는 잘 모르겠지만 스프레드시트에서 작동했습니다.도움이 될까요?
Table3.ListRows[1].Range.Insert(Excel.XlInsertShiftDirection.xlShiftDown);
사용해 보세요.
private void GetExcelSheets(string FilePath, string Extension, string isHDR)
{
string conStr="";
switch (Extension)
{
case ".xls": //Excel 97-03
conStr = ConfigurationManager.ConnectionStrings["Excel03ConString"]
.ConnectionString;
break;
case ".xlsx": //Excel 07
conStr = ConfigurationManager.ConnectionStrings["Excel07ConString"]
.ConnectionString;
break;
}
//Get the Sheets in Excel WorkBoo
conStr = String.Format(conStr, FilePath, isHDR);
OleDbConnection connExcel = new OleDbConnection(conStr);
OleDbCommand cmdExcel = new OleDbCommand();
OleDbDataAdapter oda = new OleDbDataAdapter();
cmdExcel.Connection = connExcel;
connExcel.Open();
//Bind the Sheets to DropDownList
ddlSheets.Items.Clear();
ddlSheets.Items.Add(new ListItem("--Select Sheet--", ""));
ddlSheets.DataSource=connExcel
.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
ddlSheets.DataTextField = "TABLE_NAME";
ddlSheets.DataValueField = "TABLE_NAME";
ddlSheets.DataBind();
connExcel.Close();
txtTable.Text = "";
lblFileName.Text = Path.GetFileName(FilePath);
Panel2.Visible = true;
Panel1.Visible = false;
}
언급URL : https://stackoverflow.com/questions/27554279/how-to-insert-rows-to-table-object-inside-an-excel-sheet
'programing' 카테고리의 다른 글
통화로 더블 포맷하는 방법 - 스위프트 3. (0) | 2023.08.20 |
---|---|
Swift Bridging 헤더 가져오기 문제 (0) | 2023.08.20 |
argc와 argv의 주소가 12바이트 차이가 나는 이유는 무엇입니까? (0) | 2023.08.20 |
동작 주체 초기값이 null입니까? (0) | 2023.08.20 |
Mac에서 도커를 완전히 제거하는 방법은 무엇입니까? (0) | 2023.08.20 |