C#用NPOI读取Excel数据到数据库中行的顺序乱怎么办?

private void button4_Click(object sender, EventArgs e)
{
string filepath= @"D:\temp1.xlsx";
FileStream filestream = new FileStream(filepath, FileMode.OpenOrCreate,FileAccess.ReadWrite);
//filestream.Position=0;
XSSFWorkbook workbook = new XSSFWorkbook(filestream);
int sheetcount = workbook.Count;
if (sheetcount > 0)
{
var sheet = workbook.GetSheetAt(0);
for (int i = 1; i <= sheet.LastRowNum; i++)
{
IRow row = sheet.GetRow(i);
string tempname = Dqml(row,0);
string tempmm = Dqml(row,1);
sjvlj(tempname,tempmm);

}
}

}
void sjvlj(string a,string b)
{
SqlConnection conn = new SqlConnection();
conn.ConnectionString = "Data Source=(local);Initial Catalog=MF;User ID=sa;Pwd=P@ssw0rd";
conn.Open();
SqlTransaction sqltran = conn.BeginTransaction();
// textBox1.Text = a;
string sqlstring = string.Format("insert into table_4(yhm,mm) values('{0}','{1}')", a,b);

SqlCommand comm = new SqlCommand(sqlstring,conn);
comm.Transaction = sqltran;
int p = comm.ExecuteNonQuery();
sqltran.Commit();
comm.Dispose();
comm.Clone();
conn.Dispose();
conn.Close();

}

string Dqml(IRow row, int l)
{
if (row != null)
{
ICell cell = row.GetCell(l);
if (cell != null)
{
if (cell.CellType == CellType.String)
return cell.StringCellValue.Trim();
}
if (cell.CellType == CellType.Numeric)
{
return cell.NumericCellValue.ToString().Trim();
}
return cell.StringCellValue.Trim();
}
return string.Empty;
}

这里可以直接在vs程序中引入Spire.Xls.dll这一个dll程序集文件就可以实现数据的导入导出了。可以直接在NuGet中搜索安装,以下是导入excel数据到datatable的代码方法:

//创建Workbook对象并加载Excel文档

Workbook workbook = new Workbook();workbook.LoadFromFile(@"F:\ExportData.xlsx" ,ExcelVersion.Version2013);

//获取第一张

sheetWorksheet sheet = workbook.Worksheets[0];

//设置range范围

CellRange range = sheet.Range[sheet.FirstRow, sheet.FirstColumn, sheet.LastRow, sheet.LastColumn];

//输出数据, 同时输出列名以及公式值

DataTable dt = sheet.ExportDataTable(range, true, true);

追问

这个东西没有用过能不能给我一个完整的例子?我照葫芦画瓢一下。看嫩不嫩满足需求。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2021-11-22
一、下载引用

下载需要引用的dll,即:NPOI.dll,NPOI.OOXML.dll,NPOI.OpenXml4Net.dll,ICSharpCode.SharpZipLib.dll(office2007版需要此dll)。

二、excel转datatable类

[csharp] view
plain copy

using System;

using System.Data;

using System.IO;

using NPOI.SS.UserModel;

using NPOI.XSSF.UserModel;

using NPOI.HSSF.UserModel;

namespace NPOIOprateExcel

{

public class ExcelUtility

{

/// <summary>

/// 将excel导入到datatable

/// </summary>

/// <param name="filePath">excel路径</param>

/// <param name="isColumnName">第一行是否是列名</param>

/// <returns>返回datatable</returns>

public static DataTable ExcelToDataTable(string filePath, bool isColumnName)

{

DataTable dataTable = null;

FileStream fs = null;

DataColumn column = null;

DataRow dataRow = null;

IWorkbook workbook = null;

ISheet sheet = null;

IRow row = null;

ICell cell = null;

int startRow = 0;

try

{

using (fs = File.OpenRead(filePath))

{

// 2007版本

if (filePath.IndexOf(".xlsx") > 0)

workbook = new XSSFWorkbook(fs);

// 2003版本

else if (filePath.IndexOf(".xls") > 0)

workbook = new HSSFWorkbook(fs);

if (workbook != null)

{

sheet = workbook.GetSheetAt(0);//读取第一个sheet,当然也可以循环读取每个sheet

dataTable = new DataTable();

if (sheet != null)

{

int rowCount = sheet.LastRowNum;//总行数

if (rowCount > 0)

{

IRow firstRow = sheet.GetRow(0);//第一行

int cellCount = firstRow.LastCellNum;//列数

//构建datatable的列

if (isColumnName)

{

startRow = 1;//如果第一行是列名,则从第二行开始读取追问

你好!能不能把后面的代码也给我?这样做数据库表是顺序和Excel表里的顺序就一致了吗?我的错在哪里?

本回答被网友采纳
第2个回答  2021-11-22

    你判断是否乱序是根据哪个字段,此字段是否自动增长?

    如果没有自动增长字段,查询时候也没指定order by,那么sql本身也没保证顺序,属于正常现象

    你在单个insert周围用了事务,没什么意义

追问

我原来的Excel表里面是有日期,是连续的。但是按照我的方式导入到数据库中日期就不连续了。

追答

那你select的时候oder by date即可

第3个回答  2021-11-22
乱就乱了,数据库中行的顺序无所谓,反正用的时候order by一下就行了。
相似回答