草庐IT

C# 使用dataGridView导入导出excel(NPOI),可以通过关键字定位,删除空行等功能

曾经以为世界很美、 2023-03-28 原文

做下记录,

首先插入一个dataGridView控件,两个button按钮(导入数据,导出数据),一个ComboBox(获取列标题使用),一个textbox(输入关键字),一个定位按钮(定位使用)

1,导入数据(NPOI)

 1   
 2         private void daoRuShuJu_cmd_Click(object sender, EventArgs e)
 3         {
 4             DataTable daNpoi = new DataTable();
 5             string fileName = Application.StartupPath;
 6             fileName += "\\4G模组表.xls";  
 7             string sheetName = "4G模组情况表";
 8             bool isColumnName = true;
 9             IWorkbook workbook;
10             string fileExt = Path.GetExtension(fileName).ToString();
11             using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read))
12             {
13                 if (fileExt == ".xlsx")
14                 {
15                     workbook = new XSSFWorkbook(fs);
16                 }
17                 else if (fileExt == ".xls")
18                 {
19                     workbook = new HSSFWorkbook(fs);
20                 }
21                 else
22                 {
23 
24                     workbook = null;
25                 }
26 
27                 ISheet sheet = null;
28                 if (sheetName != null && sheetName != "")
29                 {
30                     sheet = workbook.GetSheet(sheetName);
31                     if (sheet == null)
32                     {
33                         sheet = workbook.GetSheetAt(0);
34                     }
35 
36                 }
37                 else
38                 {
39                     sheet = workbook.GetSheetAt(0);
40                 }
41 
42                 IRow header = sheet.GetRow(sheet.FirstRowNum);
43                 int startRow = 0;
44                 if (isColumnName)
45                 {
46                     startRow = sheet.FirstRowNum + 1;
47                     for (int i = header.FirstCellNum; i < header.LastCellNum; i++)
48                     {
49                         ICell cell = header.GetCell(i);
50                         if (cell != null)
51                         {
52                             string cellValue = cell.ToString();
53                             if (cellValue != null)
54                             {
55                                 DataColumn col = new DataColumn(cellValue);
56                                 daNpoi.Columns.Add(col);
57                             }
58                             else
59                             {
60                                 DataColumn col = new DataColumn();
61                                 daNpoi.Columns.Add(col);
62                             }
63                         }
64                     }
65                 }
66 
67                 for (int i = startRow; i <= sheet.LastRowNum; i++)
68                 {
69                     IRow row = sheet.GetRow(i);
70                     if (row == null)
71                     {
72                         continue;
73                     }
74                     DataRow dr = daNpoi.NewRow();
75                     for (int j = row.FirstCellNum; j < row.LastCellNum; j++)
76                     {
77 
78                         if (row.GetCell(j) != null)
79                         {
80                             dr[j] = row.GetCell(j).ToString();
81                         }
82                     }
83                     daNpoi.Rows.Add(dr);
84                 }
85             }
86 
87             dataGridView1.DataSource = daNpoi;
88         }

2,导出数据(NPOI)

 1   private void baoCunShuJu_cmd_Click(object sender, EventArgs e)
 2         {
 3             DataTable dtTable = dataGridView1.DataSource as DataTable;
 4             string sheetName = "4G模组情况表";   //sheet名字
 5             IWorkbook wb = new HSSFWorkbook();
 6             ISheet sheet = string.IsNullOrEmpty(sheetName) ? wb.CreateSheet("sheet1") : wb.CreateSheet(sheetName);
 7             int rowIndex = 0;
 8             if (dtTable.Columns.Count > 0)
 9             {
10                 IRow header = sheet.CreateRow(rowIndex);
11                 for (int i = 0; i < dtTable.Columns.Count; i++)
12                 {
13                     ICell cell = header.CreateCell(i);
14                     cell.SetCellValue(dtTable.Columns[i].ColumnName);
15                 }
16             }
17             if (dtTable.Rows.Count > 0)
18             {
19                 for (int i = 0; i < dtTable.Rows.Count; i++)
20                 {
21                     rowIndex++;
22                     IRow row = sheet.CreateRow(rowIndex);
23                     for (int j = 0; j < dtTable.Columns.Count; j++)
24                     {
25                         ICell cell = row.CreateCell(j);
26                         cell.SetCellValue(dtTable.Rows[i][j].ToString());
27                     }
28                 }
29             }
30 
31             for (int i = 0; i < dtTable.Columns.Count; i++)
32             {
33                 sheet.AutoSizeColumn(i);
34             }
35 
36             string fileName = Application.StartupPath;      // debug 目录                     
37             fileName += "\\4G模组表.xls";  //excel 名字
38             using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write))
39             {
40                 wb.Write(fs);
41             }
42             MessageBox.Show("保存成功");
43         }

3,删除空行函数

// 删除空白行调用函数,在不需要用户添加新行或者数据的时候使用,ALLowUsertoAddRows 这个属性需要设置false
//如果ALLowUsertoAddRows 这个属性是true,则,用户可以输入数据,但是row < view.Rows.Count需要 -1不去判断最后一行

// 所以传入的x根据情况更改,想用户可以输入,ALLowUsertoAddRows的值为true,    x=0;

//不想用户输入ALLowUsertoAddRows的值为false    x=1;

 1  private void clearGrid(DataGridView view, int x)
 2         {
 3             for (int row = 0; row < (view.Rows.Count - x); ++row)
 4             {
 5                 bool isEmpty = true;
 6                 for (int col = 0; col < view.Columns.Count; ++col)
 7                 {
 8                     object value = view.Rows[row].Cells[col].Value;
 9                     if (value != null && value.ToString().Length > 0)
10                     {
11                         isEmpty = false;
12                         break;
13                     }
14                 }
15                 if (isEmpty)
16                 {
17                     view.Rows.RemoveAt(row--);
18                 }
19             }
20         }

4,获取excel的列标题,给ComboBox控件

 1  public void huoQu_Column()   //把excel表各列标题弄到combobox上
 2         {
 3            // int Rowcount = dataGridView1.RowCount;//获取datagridview的行数
 4             int Columncount = dataGridView1.ColumnCount;//获取datagridview的列数
 5            // dataGridView2.ColumnCount = Columncount;  //新增列
 6            // dataGridView2.ColumnHeadersVisible = true;  //新增的列显示出来
 7             for (int i = 0; i < Columncount; i++)
 8             {
 9                 string var = this.dataGridView1.Columns[i].HeaderText;
10                // this.dataGridView2.Columns[i].HeaderText = this.dataGridView1.Columns[i].HeaderText;  //2的列名和1的一样
11               //  dataGridView2.Columns[i].MinimumWidth = dataGridView1.Columns[i].MinimumWidth;   //2的列宽和1 一样
12                 // = dataGridView1.Rows[0].Cells[i].Value.ToString();
13                 lie_ming_cb.Items.Add(var);
14               //  lie_ming_cb_1.Items.Add(var);
15                // if (var == "IMEI")
16                // {
17                    // lie_ming_cb_1.SelectedIndex = i;
18               //  }
19             }
20             lie_ming_cb.SelectedIndex = 0;
21         }

 

5,定位,可以在每个列里根据关键字去查找,并且定位到行,可实现下一条功能

 1  int xiayitiao_int = 0;  //下一条标记
 2 
 3         private void chaZhao_bt_1_Click(object sender, EventArgs e)   //定位按钮
 4         {
 5             DataTable rentTable = (DataTable)dataGridView1.DataSource;//获取数据源
 6             int r = 0;
 7             bool dingwei_f;  //定位标记,
 8 
 9 
10             if ((guanJianZi_box.Text != "") && (guanJianZi_box.Text != "/请输入关键字/"))
11             {
12                 for (int i = xiayitiao_int; i < rentTable.Rows.Count; i++)
13                 {
14                     dingwei_f = rentTable.Rows[i][lie_ming_cb.Text].ToString().Contains(guanJianZi_box.Text); //对比字符串,
15 
16                     if (dingwei_f)
17                     {
18                         //指定行
19                         dataGridView1.ClearSelection();
20                         dataGridView1.Rows[i].Selected = true;
21                         //让指定行处于选中状态(状态)
22                         dataGridView1.CurrentCell = dataGridView1.Rows[i].Cells[1];
23                         dataGridView1.CurrentRow.Selected = true;
24                         dingwei_f = false;
25                         xiayitiao_int = i+1; //下一条的标记
26                         r++;
27                         return;
28                     }
29                 }
30                 if (r > 0)
31                 {
32 
33                 }
34                 else
35                 {
36                     MessageBox.Show("没有匹配项或已经是最后一条,将从第一条继续查找", "提示");
37                     xiayitiao_int = 0;   //重新查找
38                 }
39             }
40             else
41             {
42                 MessageBox.Show("请输入正确的关键字", "提示");
43             }
44         }

6,textbox可以敲回车直接查找,需要添加textbox的KeyDown事件

 private void guanJianZi_box_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyValue == 13)
            {
                chaZhao_bt_1_Click(sender, e);
            }
        }

 

有关C# 使用dataGridView导入导出excel(NPOI),可以通过关键字定位,删除空行等功能的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  3. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  4. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  5. ruby - 在 Ruby 中使用匿名模块 - 2

    假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于

  6. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

    我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

  7. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  8. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  9. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  10. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

随机推荐