-
单元格值_【VBA】江湖救急:怎样获取单元格填充颜色的RGB值
2021-01-12 08:12:00我们都知道,只要知道一种颜色的RGB值,不需要格式刷,我们只需要更改RGB的数值,就能够在很多地方用上这种颜色,今天就来教教大家怎么用VBA批量获取单元格中的颜色RGB值。要获取Color值,首先我们得了解它的属性,...今天,有人问我,在工作表中有的单元格填充了颜色,我怎么知道这个单元格的RGB数据(或者值)是什么呢?
我们都知道,只要知道一种颜色的RGB值,不需要格式刷,我们只需要更改RGB的数值,就能够在很多地方用上这种颜色,今天就来教教大家怎么用VBA批量获取单元格中的颜色RGB值。
要获取Color值,首先我们得了解它的属性,不知道该用什么属性的可以去录制宏试试,不会的戳链接学习【VBA】如何录制宏。Interior 内部的
Interior.Color 内部的颜色
interior是Range的一个属性,一般用来设置单元格内部的格式的,Color是Interior的一个属性。所以要给单元格填充颜色,如给A1单元格填充颜色,需用如下代码
Range("A1").Interior.Color = (此处赋予一个数值)
如果你录制过填充颜色的宏,那么你肯定可以发现,录制的颜色代码是一个很大的数值:如图
也就是说,我们只用知道RGB数值与这个值的关系就能够知道单元格填充的RGB颜色是多少了。
下面我们就来看看RGB颜色的代码吧。
Sub getRGB() Dim rng As Range Dim r, g, b As Integer Dim c As Double For Each rng In Range("A2:A14") '循环遍历单元格 c = rng.Interior.Color '将单元格的颜色赋值给C r = c Mod 256 g = (c - r) / 256 Mod 256 b = (c - r - g * 256) / 256 ^ 2 rng.Offset(0, 1) = r & "," & g & "," & b '将r,g,b在遍历的单元格偏移一列显示,用逗号分隔 rng.Offset(0, 2) = c '遍历的单元格偏移两列处给单元格赋值单元格颜色值 NextEnd Sub
代码解析:
第5行:循环遍历单元格
第6行:将单元格颜色赋值给c
第7-9行:利用R,G,B与Color值的关系,将R,G,B各项值算出来
第10行:将r,g,b在遍历的单元格偏移一列显示,用逗号分隔
第11行:遍历的单元格偏移两列处给单元格赋值单元格颜色值
Color值与RGB的关系:
以下c代表Color的值(以下为EXCEL公式计算法):
其实这段代码很简单,由于颜色在代码中其实也是以数值体现,那么我们只用找出R,G,B与Color值的关系,代码就很容易写了。r = MOD(c,256)g = MOD((c - r) / 256,256)b = (c - r - g * 256) / 256 ^ 2
-
如何获取填报表中单元格的值
2016-11-23 21:04:01那么,如果想在填报表中获取某个单元格的值,比如在入库前需要进行进一步的检查或操作等,又该怎么做呢? 润乾报表在web端是以纯html方式展现的,对于每一张报表、报表中的每一个单元格都有对应的ID值,所以...在润乾填报表中,可以在报表模板的设计阶段定义好单元格与数据库表字段间的映射关系,轻松实现零代码数据入库。那么,如果想在填报表中获取某个单元格的值,比如在入库前需要进行进一步的检查或操作等,又该怎么做呢?
润乾报表在web端是以纯html方式展现的,对于每一张报表、报表中的每一个单元格都有对应的ID值,所以我们可以通过ID值来精确定位到某个单元格上,从而可以获取该单元格的值并可以进行进一步的操作。
这里以一个简单的例子来说明如何获取单元格的值。以一个按钮的方式弹出获取到的单元格的值。
实现步骤:
1.首先要定位单元格。我们的报表在jsp页面展现的时候是放在一个table表格中去展现,换句话说,报表实际上是在table中去扩展去显示的,这个时候就需要通过报表的name去定位单元格的位置。
2.写一个javaScript函数,得到某个单元格的值,并用alert()函数展示出来。
3.在jsp页面上定义一个按钮,点击触发此javaScript函数。
js函数写法如下:
function _getDispValueByName(){
var cell = document.getElementById(”report1_A4″).innerText; //通过ID去定位单元格,这个为扩展后的A4单元格
alert(cell.value); //用alert()函数弹出这个单元格的值
}单元格的调用方法是: 在报表右侧属性的--web---html事件 的值 写 :οnclick=“ _getDispValueByName()”
然后发布到浏览器,点击单元格就可以弹出对应的值。
注意:
如果按照上面的操作设置后仍然不能触发onclick事件,需要在展现界面的jsp的report:html标签内添加generateCellId="yes"标签属性。
-
怎么获取其他窗体中datagridview中的单元格值
2016-09-14 17:58:08现在我想在窗体1中的下拉列表显示点位列表的点标签,本人甚至菜鸟都不是,所以不会数据库啥的。可能绑定数据库能解决? [img=https://img-bbs.csdn.net/upload/201609/14/1473847034_787082.png][/img] 各位大神... -
jsp中怎么获取每个表格中指定的某一个单元格的值。并可以给他赋值
2016-11-22 07:20:44jsp中怎么获取每个表格中指定的某一个单元格的值。并给每个表单元赋值。 表格是循环打印显示的。放在for循环下的 -
在dataGridView1某单元格刚输入的值还处在编辑状态中,按enter键获取改单元格的值,怎么实现啊?
2012-06-24 14:23:36在dataGridView1某单元格刚输入的值还处在编辑状态中,按enter键获取改单元格的值,怎么实现啊?string ss = ""; for (int i = 0; i < dataGridView1.RowCount; i++) { ss = dataGridView1.Rows... -
关于从Excel中读取数据问题,并将被合并的单元格的值分别读取到合并占用的每一个单元格中。
2019-04-09 18:51:31但是被合并的单元格的值我们要怎么处理呢?经试验发现,被合并的单元格并不是每一行都存在值,而是只有被合并的第一行单元格中有数据。我们的解决思路是先获取整个Excel表格中被合并的单元格的栏位。在读取单元格的...如上图所示,我们想读取Excel表格中的数据,并将其封装进实体类中,用poi是很容易完成操作的。但是被合并的单元格的值我们要怎么处理呢?经试验发现,被合并的单元格并不是每一行都存在值,而是只有被合并的第一行单元格中有数据。我们的解决思路是先获取整个Excel表格中被合并的单元格的栏位。在读取单元格的同时遍历被合并过得单元格,获取被合并单元格的四个坐标,将其与当前单元格坐标进行比较。若当前单元格包含在合并单元格内,则获取左上角(及有值的单元格数据),并存入bean中。以下是代码:
实体类:
package bean; public class excelDto { //保全项目序号 private String projectNum; //保全项目名称 private String projectName; //场景编号 private String sceneNum; //测试场景 private String testScene; //测试类 private String testClass; //测试参数VData private String testParameterVData; //测试参数Operate private String testOperate; //保单号 private String policyNo; //预期金额结果 private String sumResult; //预期结果取数逻辑 private String result; public excelDto() { super(); // TODO Auto-generated constructor stub } public excelDto(String projectNum, String projectName, String sceneNum, String testScene, String testClass, String testParameterVData, String testOperate, String policyNo, String sumResult, String result) { super(); this.projectNum = projectNum; this.projectName = projectName; this.sceneNum = sceneNum; this.testScene = testScene; this.testClass = testClass; this.testParameterVData = testParameterVData; this.testOperate = testOperate; this.policyNo = policyNo; this.sumResult = sumResult; this.result = result; } public String getProjectNum() { return projectNum; } public void setProjectNum(String projectNum) { this.projectNum = projectNum; } public String getProjectName() { return projectName; } public void setProjectName(String projectName) { this.projectName = projectName; } public String getSceneNum() { return sceneNum; } public void setSceneNum(String sceneNum) { this.sceneNum = sceneNum; } public String getTestScene() { return testScene; } public void setTestScene(String testScene) { this.testScene = testScene; } public String getTestClass() { return testClass; } public void setTestClass(String testClass) { this.testClass = testClass; } public String getTestParameterVData() { return testParameterVData; } public void setTestParameterVData(String testParameterVData) { this.testParameterVData = testParameterVData; } public String getTestOperate() { return testOperate; } public void setTestOperate(String testOperate) { this.testOperate = testOperate; } public String getPolicyNo() { return policyNo; } public void setPolicyNo(String policyNo) { this.policyNo = policyNo; } public String getSumResult() { return sumResult; } public void setSumResult(String sumResult) { this.sumResult = sumResult; } public String getResult() { return result; } public void setResult(String result) { this.result = result; } }
逻辑代码:
package Demo; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.text.DecimalFormat; import java.text.ParseException; import java.util.ArrayList; import java.util.List; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import bean.excelDto; public class poiDemo { public static void main(String[] args) throws IOException { String path = "H:/"; String fileName = "自动化测试保单数据-保全算费"; String fileType = "xlsx"; //传入Excel文件,执行方法返回封装后的数据 List<excelDto> excelList = read(path, fileName, fileType); //遍历List集合并打印各属性 for (excelDto excelDto : excelList) { System.out.print(excelDto.getProjectNum() + " "); System.out.print(excelDto.getProjectName() + " "); System.out.print(excelDto.getSceneNum() + " "); System.out.print(excelDto.getTestScene() + " "); System.out.print(excelDto.getTestClass() + " "); System.out.print(excelDto.getTestParameterVData() + " "); System.out.print(excelDto.getPolicyNo() + " "); System.out.print(excelDto.getSumResult() + " "); System.out.println(excelDto.getResult()); } } public static List<excelDto> read(String path,String fileName,String fileType) throws IOException { InputStream stream = new FileInputStream(path+fileName+"."+fileType); Workbook wb = null; //判断传入的Excel文件是03还是07,进行不同的操作。 if (fileType.equals("xls")) { wb = new HSSFWorkbook(stream); } else if (fileType.equals("xlsx")) { wb = new XSSFWorkbook(stream); } else { System.out.println("您输入的excel格式不正确"); } //读取总页数并循环读取 Sheet sheet1 = wb.getSheetAt(1); // 总共的行数 int rowLens = sheet1.getLastRowNum(); // 设定列数 int colLens = 10; Row row = null; Cell cell = null; String content = ""; //创建List集合,泛型为excelDto并将bean存入List List<excelDto> list = new ArrayList<excelDto>(); //创建实体bean对象 excelDto exceldto = null; //获取整张表有多少个合并单元格区域 int numMergedRegions = sheet1.getNumMergedRegions(); for (int rowCount = 1; rowCount <= rowLens; rowCount++) { //多次创建实体类bean。 exceldto = new excelDto(); row = sheet1.getRow(rowCount); if (row != null) { for (int colCount = 0; colCount < colLens; colCount++) { //根据行数与列数确定单元格位置。 cell = row.getCell((short) colCount); //调用方法读取单元格内容。 content = getCellValue(cell).trim(); //判断当前单元格是否是在所有被合并单元格区域 for(int j = 0;j < numMergedRegions;j++){ CellRangeAddress range = sheet1.getMergedRegion(j); int firstColumn = range.getFirstColumn(); int lastColumn = range.getLastColumn(); int firstRow = range.getFirstRow(); int lastRow = range.getLastRow(); //如果单元格被合并 if(rowCount >= firstRow && rowCount <= lastRow && colCount >= firstColumn && colCount <= lastColumn){ cell = sheet1.getRow(firstRow).getCell((short) firstColumn); content = getCellValue(cell).trim(); switch (colCount) { case 1: if(content != null && content.length() > 0){ String[] split = content.split("-"); exceldto.setProjectNum(split[0]); exceldto.setProjectName(split[1]); } break; case 2: exceldto.setSceneNum(content); break; case 3: exceldto.setTestScene(content); break; case 4: exceldto.setTestClass(content); break; case 5: exceldto.setTestParameterVData(content); break; case 6: exceldto.setTestOperate(content); break; case 7: exceldto.setPolicyNo(content); break; case 8: exceldto.setSumResult(content); break; case 9: exceldto.setResult(content); break; } } //单元格未合并 else{ switch (colCount) { case 1: if(content != null && content.length() > 0){ String[] split = content.split("-"); exceldto.setProjectNum(split[0]); exceldto.setProjectName(split[1]); } break; case 2: exceldto.setSceneNum(content); break; case 3: exceldto.setTestScene(content); break; case 4: exceldto.setTestClass(content); break; case 5: exceldto.setTestParameterVData(content); break; case 6: exceldto.setTestOperate(content); break; case 7: exceldto.setPolicyNo(content); break; case 8: exceldto.setSumResult(content); break; case 9: exceldto.setResult(content); break; } } } } list.add(exceldto); } } return list; } public static String getCellValue(Cell cell) { if (cell != null) { switch (cell.getCellType()) { case Cell.CELL_TYPE_BLANK: return ""; case Cell.CELL_TYPE_NUMERIC: String strValue = String.valueOf(cell.getNumericCellValue()); if (strValue != null && strValue.indexOf(".") != -1 && strValue.indexOf("E") != -1) { try { return new DecimalFormat().parse(strValue).toString(); } catch (ParseException e) { e.printStackTrace(); } } else { if (strValue.endsWith(".0")) { return strValue.substring(0, strValue.indexOf(".0")); } else { return strValue; } } case Cell.CELL_TYPE_STRING: return (cell.getStringCellValue() + "").trim(); case Cell.CELL_TYPE_FORMULA: return (cell.getCellFormula() + "").trim(); case Cell.CELL_TYPE_BOOLEAN: return cell.getBooleanCellValue() + ""; case Cell.CELL_TYPE_ERROR: return cell.getErrorCellValue() + ""; } } return ""; } }
第一次发帖,欢迎提问。
-
js怎么获取表某一格的值_javascript,_请问JS如何实现获取表格中的单元格里面的数据,并让其累加呢?...
2021-01-17 19:19:48请问JS如何实现获取表格中的单元格里面的数据,并让其累加呢?var getTd=document.getElementById("myTable");rowsLength=getTd.rows.length;var theDate ;for(var i=1;i{var std=getTd.rows[i].cells[2].innerText;...请问JS如何实现获取表格中的单元格里面的数据,并让其累加呢?
var getTd=document.getElementById("myTable");
rowsLength=getTd.rows.length;
var theDate ;
for(var i=1;i
{
var std=getTd.rows[i].cells[2].innerText;
var stdVlue=std.replace(/天/gi,'');
stdVlue=Number(stdVlue);
//getTd.rows[i].cells[11].innerText=stdVlue;
for(var g=rowsLength;g>=2;g--)
{
var std2=getTd.rows[g].cells[11].innerText;
var stdVlue2=std2.replace(/天/gi,'');
stdVlue2=Number(stdVlue2);
theDate=stdVlue2+stdVlue;
}
getTd.rows[i].cells[11].innerText=stdVlue;
document.write(stdVlue);
document.write("
");document.write(theDate);
document.write("
");}
相关阅读:
Android 4.0 手动结束应用程序后关机重启接受不到开机广播
非阻塞的servlet还能在线程内共享对象吗?
retrofit怎么针对不同的url统一添加header?
select如何实现默认选中ng-options中的一个值?
开发webapp 需要什么技术基础吗? html5 js css3 PHP 除了这些还需要什么?
怎么跟测试沟通他的defects 重叠的问题
javascript的作用域问题
URLSearchParams 接口
dwz框架的lookupGroup这个地方可不可以修改?
AngularJS 单页面应用首页加载优化有哪些方法?
Android Fragment片段切換的問題
WKWebview加载本地HTML报错“Could not create a sandbox extension for /”
如何写这个弹框效果?
互联网技术有什么自己的特点?
android版QQ我的文件->本机文件 里的界面怎么实现
微信开发者问题
css overflow:hidden问题
请问backbone和什么组件库搭配更合适?
MongoDB 如何根据查询结果进行更新?
Java Jackson中 JsonNode ObjectNode ArrayNode 联系与区别
-
java遍历服务器里的所有excel文件读取特定单元格的值,循环读取文件的代码怎么写
2016-02-23 11:24:06* //读取excel中的全部内容写入到新的excel中 //读取第一张工作表 * * jxl.write.WritableSheet ws = wwb.getSheet(0); * * //获得第一个单元格对象 * * jxl.write.WritableCell wc ... -
datagridcolumn单元格怎么显示查询到的某个表的字段值(字段值可能为多个)
2014-04-17 16:42:00例如,在之前做的项目中,查询mhz_xckcr表,select出某个业务的现场勘察人信息,select出的现场勘察人姓名(可能有多个)要在前台datagrid的一个datagridcolmn单元格显示出来。 1.查询表数据,保存到实体类集合list... -
js读取excel中某几列单元格中的数值报错
2020-02-22 16:11:46浏览器打开测试的代码,我把读取出来的值赋给k和j,打印出来,可以显示数值,但最后总会报错,想问下大家,这个报错得怎么把它消除掉 ![图片说明]... -
dialog内容值返回datagridview的单元格
2017-03-28 01:28:07最近困惑我,关于dialog内容值返回,我在easy ui的datagridview的单元格onclickcell事件里写了一个弹窗dialog,在这个dialog中放了一个文本,要实现把这个dialog文本中输入的内容提交给原来单击的这个单元格,然后... -
使用POI读取单元格的内容
2020-06-18 09:53:22因为项目中使用到POI获取单元格的内容,。 刚开始也是去百度 怎么做,后来发现官网上的更加好用。所有记录一下,看到的也可以少走些弯路 不废话,直接贴官网代码,需要导入apach 的poi 的相应的包。 代码中有两种... -
在layui中如何向某单元格里面添加图标
2019-07-07 19:20:56现在我就想在供应商的单元格中添加图标,效果图如下: 这种效果是怎么实现的呢?来看一下吧。 在layui表格中有一个很好用的函数,就是done回调函数,在done里面可以接收表格里面所有的数据,可以很方便我们获取值,... -
如何获取值所在的行
2010-10-31 13:16:00我知道那一行中的一个单元格的值!我要怎么去获取那一行啊!我是想把那一行给删除的!麻烦啦!! -
python selenium在编写过程中遇到的问题记录
2020-01-10 15:16:57问题1. 在一个文件夹中没有__init__.py这个文件,那在执行生成测试报告的时候,出现找不到测试... 在页面上都是table表的时候,怎么获取单元格中的值,而且table表的html显示上面不是table这样的标签,都是div的。那... -
python怎么读取excel做参数化-Python读取excel文件中带公式的值的实现
2020-11-11 14:58:16在进行excel文件读取的时候,我自己设置了部分直接从公式获取单元格的值但是用之前的读取方法进行读取的时候,返回值为空import osimport xlrdfrom xlutils.copy import copyfile_path = os.path.abspath(os.path.... -
润乾报表js获取下拉数据集下拉框的显示值
2017-07-10 09:23:56制作填报表时,有时会用到下列数据集和下拉列表,如果想在js中得到下拉数据集和下拉列表的显示值,该怎么做呢? 可以用下面的代码实现 //cellVale单元格的真实值,单元格名称 function_... -
获取选中值_重复值自动显示颜色?
2021-01-12 23:25:48在Excel中查找重复值容易,但是如果我们想要将重复值用单独的颜色标记,应该怎么操作呢?如将下列表格中,“口红”所在的单元格用颜色标记。操作步骤第一步,按ctrl键同时选中两列数据,点击“条件格式”,选择... -
findfirstfile函数为什么不能遍历doc_【VBA】自定义函数ColorSum:按单元格颜色求和...
2021-01-19 19:30:49上一篇给大家介绍了如何获取单元格中的RGB值,既然讲到颜色了,本文继续来给大家讲讲,怎么根据颜色求和,如果你用公式来做单元格颜色求和,还是很麻烦的,其实VBA代码做单元格颜色求和很容易。之前,我都给大家讲的... -
怎么判断mssql表属性是标识列_Power BI学习-度量值,计算列,新建表的区别
2020-12-03 07:11:36作用:①置于表中的值中②根据表中所处的单元格上下文进行计算重复使用度量值的好处:①方便梳理公式的逻辑②操作更简单:可以直接引用③一劳永逸:如果度量值需要变化时,其他引用此度量值的度量值都会随之改变④不... -
制作一个考勤表格如何实现鼠标拖动选择多个单元格然后右键菜单实现批量考勤
2019-06-19 17:50:03!... 用bootstraptable做了一个考勤的表格。...请问怎么鼠标拖动怎么选取多个单元格弹出菜单然后批量设置呢?... $("#singlelast").append(...但是获取的都是一行的值,获取不到单元格的值,该怎么办呢? -
QTableView如何获取当前显示的可见行和列的索引?
2019-11-20 14:38:13* 假设一个QTableView的表格,其显示过万个单元格,且这些单元格的值都是些需要实时刷新(如1秒)的值,那么通常的实现就是:定义一个1秒的定时器,定时触发for循环,自第0行0列刷新到第n行n列。 * 但实际上,... -
请问在java中做导出的时候应该怎么实现下拉列表框
2013-10-23 06:49:17* @功能:获取单元格默认样式 * @param wb * @return */ private HSSFCellStyle getCellDefaultStyle(HSSFWorkbook wb,short color) { // 设置单元格样式 HSSFCellStyle cellstyle = wb.... -
怎么用js函数判断输入的信息是英文还是汉子还是数字_宏表函数大全
2021-01-16 13:56:59Excel 宏表函数介绍1、什么是宏表函数宏表函数是又称excel4.0函数,是Excel第4个版本的函数,为了考虑兼容...宏表函数可以实现现有版本的函数或技巧无法完成的功能,比如取单元格填充色值、获取工作表的名称列表等。... -
比较两个对象.怎么找出来那些字段不一样,并展示到页面中?
2010-11-05 11:21:44如果是在页面中比较,我就得想方法来获取两行的上下单元格的字段来做比较,如果不一样,给当前单元格加上红色标记 问问大家还有没有什么更好的办法?或者请大家给我以上两个想法给点建议 ! 不胜感激 ! -
计算WPS表格中带文本的计算表达式的结果
2019-08-17 10:44:11最近,弟弟问我怎么从WPS表格中提取含文本的算术表达式中计算表达式的结果,如下表, 思路 利用正则表达式先提取数字,小数点,±*/()等符号,以获取完整的算术表达式 利用EVALUATE计算算术表达式的值 注意:提取的... -
java使用poi解析或处理excel的时候,如何防止数字变成科学计数法的形式和其他常见Excel中数据转换问题
2018-11-30 11:08:33当使用POI处理excel的时候,遇到了比较长的数字,虽然excel里面设置该单元格是文本类型的,但是POI的cell的类型就会变成数字...那么获取这个单元格的原始的数据,就其实是一个double怎么转换成整数的问题了。 使用D... -
第二个下拉列表的值根据第一个变化_听说你还不会制作多级下拉列表,手把手教你,很简单...
2020-11-29 16:32:17私信回复关键词【UP】~立即获取VLOOKUP函数用法教程合集,一看就会!老师,请问这个多级下拉列表怎么做?要明白这个效果怎么做,你必须清楚...类似的,选择「大类」的时候,I 列的「中类」也是随之更新的。因为单元... -
两个年月日怎么相减_Excel日期公式的那些事,如何计算两个日期相差年月日的问题...
2020-12-31 01:22:24在Excel中,系统把日期和时间视为一种数值的特殊表现形式,它更倾向于是一种形式,而不是数据类型,实质仍然是数值,可以像数值一样参与运算,并返回“日期类型”的值。获取今天的日期可以用TODAY函数,而这个函数又...
-
面向对象总结<二>
-
551. 学生出勤记录 I
-
vue3从0到1-超详细
-
猛Ma象-源码
-
(自用笔记)Linux笔记(知识、命令)
-
kubectl命令大全
-
Git开发管理之道
-
DHCP 动态主机配置服务(在Linux环境下,配置单网段或跨网段提)
-
MySQL 高可用(DRBD + heartbeat)
-
Redis客户端配置优化建议
-
mpu9250姿态解算
-
网络服务器-源码
-
K8S部署Pod到指定节点
-
单元测试:获取与M2.x CE一起使用的单元测试-源码
-
【C++】Visual Studio教程(十二) -代码编辑器功能
-
linux学习笔记(六)网络命令与关机重启命令
-
LoginCNodeJWT:登录节点和JWT-源码
-
rabbitmq-logger:记录错误和异常int Rabbitmq交换-源码
-
Pagina-Prueba:Pagina Sencilla de prueba-源码
-
使用vue搭建微信H5公众号项目