精华内容
下载资源
问答
  • 数据库存储里面ID(序号)一般是自增性质,不停增加、删除操作后,这个序号就会乱,数字 不连续,而我们要显示到GUI里面序号肯定需要按正常顺序显示,本文提供构造顺序序号列的方法; 操作(比如...

    问题描述

    我们在用Javafx开发应用程序的时候,TableView是比较常用的用来展示数据的控件,但是它的灵活性确实没有WEB开发里面的控件好,比如,我遇到的问题就有:

    1. 数据库存储里面的ID列(序号)一般是自增性质的,不停的增加、删除操作后,这个序号列就会乱,数字 不连续,而我们要显示到GUI里面的序号列肯定需要按正常顺序显示的,本文提供构造顺序序号列的方法;
    2. 操作列(比如删除)的渲染问题,一种思路就是在表格控件之外加一个删除按钮,点击按钮的时候判断一下当前选中的行,然后执行删除操作。本文讨论另外一种思路,单独在表格里面添加一个删除列(每行都有一个删除按钮,单击则删除所在行数据);
    3. 很多时候,我们具有个性化显示表格数据的需求,比如,显示学生数学成绩的某列,我们希望把那些低于60分的分数标红,而及格分数则不做处理;
    TableView理解

    JavaFX表格控件渲染数据主要有两种方法:
    1. setCellValueFactory(new PropertyValueFactory<>(“字段名”)),适合表格列数已知,有对应实体的情况(比如,学生信息,我们假定它只有姓名、性别、学号、地址、联系方式等固定字段,则适合采用此种方式进行渲染);
    2. setCellValueFactory(new MapValueFactory<>(“对应列的键值”)),适合表格列数在渲染之前未知,需要根据传入数据的维数确定的情况,此时因为没有固定列数,所以一般数据也没有对应的实体类,数据需要用Map进行构造,一行数据就是一个Map;
    本文主要针对列数已知的情况,Map的情况同理。

    代码DEMO
    工程目录如下图:

    这里写图片描述

    Main.java

    /**
     * 实现表格的序号列的计算填充,
     * 实现按钮操作列的正常显示以及事件绑定
     */
    package application;
    
    import java.io.IOException;
    
    import javafx.application.Application;
    import javafx.fxml.FXMLLoader;
    import javafx.scene.Scene;
    import javafx.scene.layout.AnchorPane;
    import javafx.stage.Stage;
    
    public class Main extends Application {
    
        @Override
        public void start(Stage primaryStage) {
            try {
                FXMLLoader loader = new FXMLLoader();
                loader.setLocation(this.getClass().getResource("FXTable.fxml"));
                // 为表格设置控制器
                loader.setController(new TableController());
                AnchorPane rootPane = loader.load();
                Scene scene = new Scene(rootPane,506,460);
                primaryStage.sizeToScene();
                primaryStage.setScene(scene);
                primaryStage.show();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    }

    Student.java

    package application;
    
    public class Student {
        private String firstName;
        private String lastName;
        private int age;
    
        public String getFirstName() {
            return firstName;
        }
    
        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }
    
        public String getLastName() {
            return lastName;
        }
    
        public void setLastName(String lastName) {
            this.lastName = lastName;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public Student(String firstName, String lastName, int age) {
            this.firstName = firstName;
            this.lastName = lastName;
            this.age = age;
        }
    }
    

    TableController.java

    package application;
    
    import java.net.URL;
    import java.util.ResourceBundle;
    
    import javafx.collections.FXCollections;
    import javafx.collections.ObservableList;
    import javafx.fxml.FXML;
    import javafx.fxml.Initializable;
    import javafx.scene.control.Button;
    import javafx.scene.control.CheckBox;
    import javafx.scene.control.Label;
    import javafx.scene.control.TableCell;
    import javafx.scene.control.TableColumn;
    import javafx.scene.control.TableView;
    import javafx.scene.control.cell.PropertyValueFactory;
    import javafx.scene.image.ImageView;
    
    public class TableController implements Initializable {
        @FXML
        private Label fxLabel;
        @FXML
        private TableView<Student> stuTable;
        @FXML
        private TableColumn<Student, String> idCol, fNameCol, lNameCol, delCol;
        @FXML
        private TableColumn<Student, Integer> ageCol;
        @FXML
        private TableColumn<Student, Boolean> isAdultCol;
    
        public ObservableList<Student> getStuData() {
    
            Student stu1 = new Student("赵", "哈", 16);
            Student stu2 = new Student("钱", "大", 26);
            Student stu3 = new Student("孙", "阿", 23);
            Student stu4 = new Student("李", "佛山", 17);
            Student stu5 = new Student("周", "阿萨德", 23);
            Student stu6 = new Student("吴", "更好", 12);
            Student stu7 = new Student("郑", "和", 28);
            Student stu8 = new Student("王", "费", 23);
            Student stu9 = new Student("刘", "的", 15);
            Student stu10 = new Student("关", "时是", 23);
            Student stu11 = new Student("张", "良好", 19);
            Student stu12 = new Student("诸葛", "列", 23);
            Student stu13 = new Student("司马", "咯跑", 20);
    
            ObservableList<Student> stuLists = FXCollections.observableArrayList(stu1, stu2, stu3, stu4, stu5, stu6, stu7,
                    stu8, stu9, stu10, stu11, stu12, stu13);
            return stuLists;
        }
    
        /**
         * 显示学生表格
         * 
         * @param stuLists
         */
        public void showStuTable(ObservableList<Student> stuLists) {
            fNameCol.setCellValueFactory(new PropertyValueFactory<>("firstName"));
            lNameCol.setCellValueFactory(new PropertyValueFactory<>("lastName"));
            // ageCol.setCellValueFactory(new PropertyValueFactory<>("age"));
            idCol.setCellFactory((col) -> {
                TableCell<Student, String> cell = new TableCell<Student, String>() {
                    @Override
                    public void updateItem(String item, boolean empty) {
                        super.updateItem(item, empty);
                        this.setText(null);
                        this.setGraphic(null);
    
                        if (!empty) {
                            int rowIndex = this.getIndex() + 1;
                            this.setText(String.valueOf(rowIndex));
                        }
                    }
                };
                return cell;
            });
    
            ageCol.setCellFactory((col) -> {
                TableCell<Student, Integer> cell = new TableCell<Student, Integer>() {
    
                    @Override
                    public void updateItem(Integer item, boolean empty) {
                        super.updateItem(item, empty);
                        this.setText(null);
                        this.setGraphic(null);
    
                        if (!empty) {
                            int age = this.getTableView().getItems().get(this.getIndex()).getAge();
                            this.setText(String.valueOf(age));
                            if (age < 18) {
                                this.getStyleClass().add("mark");
                            }
                        }
                    }
    
                };
                return cell;
            });
    
            isAdultCol.setCellFactory((col) -> {
                TableCell<Student, Boolean> cell = new TableCell<Student, Boolean>() {
    
                    @Override
                    public void updateItem(Boolean item, boolean empty) {
                        super.updateItem(item, empty);
                        this.setText(null);
                        this.setGraphic(null);
    
                        if (!empty) {
                            CheckBox checkBox = new CheckBox();
                            this.setGraphic(checkBox);
                            checkBox.selectedProperty().addListener((obVal, oldVal, newVal) -> {
                                if (newVal) {
                                    // 添加选中时执行的代码
                                    System.out.println("第" + this.getIndex() + "行被选中!");
                                    // 获取当前单元格的对象
                                    // this.getItem();
                                }
    
                            });
                        }
                    }
    
                };
                return cell;
            });
    
            delCol.setCellFactory((col) -> {
                TableCell<Student, String> cell = new TableCell<Student, String>() {
    
                    @Override
                    public void updateItem(String item, boolean empty) {
                        super.updateItem(item, empty);
                        this.setText(null);
                        this.setGraphic(null);
    
                        if (!empty) {
                            ImageView delICON = new ImageView(getClass().getResource("delete.png").toString());
                            Button delBtn = new Button("删除", delICON);
                            this.setGraphic(delBtn);
                            delBtn.setOnMouseClicked((me) -> {
                                Student clickedStu = this.getTableView().getItems().get(this.getIndex());
                                System.out.println("删除 " + clickedStu.getFirstName() + clickedStu.getLastName() + " 的记录");
                            });
                        }
                    }
    
                };
                return cell;
            });
    
            stuTable.setItems(stuLists);
        }
    
        @Override
        public void initialize(URL location, ResourceBundle resources) {
    
            fxLabel.setWrapText(true);
            fxLabel.setText("        javafx_Label标签的换行测试,用于弹出框的提示信息测试,Label控件也可以换行。");
    
            this.showStuTable(this.getStuData());
        }
    
    }
    

    FXTable.fxml

    <?xml version="1.0" encoding="UTF-8"?>
    
    <?import javafx.scene.control.*?>
    <?import java.lang.*?>
    <?import javafx.scene.layout.*?>
    <?import javafx.scene.layout.AnchorPane?>
    
    <AnchorPane prefHeight="461.0" prefWidth="489.0" stylesheets="@Fxtable.css" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
       <children>
          <TableView fx:id="stuTable" layoutY="54.0" prefHeight="407.0" prefWidth="402.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="54.0">
            <columns>
                <TableColumn fx:id="idCol" prefWidth="75.0" text="序号" />
              <TableColumn fx:id="fNameCol" prefWidth="87.0" text="姓氏" />
              <TableColumn fx:id="lNameCol" prefWidth="79.0" text="名字" />
                <TableColumn fx:id="ageCol" prefWidth="73.0" text="年龄" />
                <TableColumn fx:id="delCol" prefWidth="86.0" text="删除列" />
                <TableColumn fx:id="isAdultCol" prefWidth="88.0" text="成年?" />
            </columns>
          </TableView>
          <Label fx:id="fxLabel" layoutY="-1.0" prefHeight="56.0" prefWidth="402.0" />
       </children>
    </AnchorPane>
    运行截图:

    这里写图片描述

    这里写图片描述

    实现描述:
    1. 实体类里面无ID字段,表格做数据展示的时候临时构造顺序ID列数据;
    2. 删除操作列的渲染,并且添加单击事件,能够实时响应删除动作;
    3. 年龄一列的个性化显示,未成年年龄显示为红色字体;

    另,DEMO源码可以向我索要。

    展开全文
  • 数据库存储里面ID(序号)一般是自增性质,不停增加、删除操作后,这个序号就会乱,数字 不连续,而我们要显示到GUI里面序号肯定需要按正常顺序显示,本文提供构造顺序序号列的方法; 操作(比如...

    问题描述
    我们在用Javafx开发应用程序的时候,TableView是比较常用的用来展示数据的控件,但是它的灵活性确实没有WEB开发里面的控件好,比如,我遇到的问题就有:

    数据库存储里面的ID列(序号)一般是自增性质的,不停的增加、删除操作后,这个序号列就会乱,数字 不连续,而我们要显示到GUI里面的序号列肯定需要按正常顺序显示的,本文提供构造顺序序号列的方法;
    操作列(比如删除)的渲染问题,一种思路就是在表格控件之外加一个删除按钮,点击按钮的时候判断一下当前选中的行,然后执行删除操作。本文讨论另外一种思路,单独在表格里面添加一个删除列(每行都有一个删除按钮,单击则删除所在行数据);
    很多时候,我们具有个性化显示表格数据的需求,比如,显示学生数学成绩的某列,我们希望把那些低于60分的分数标红,而及格分数则不做处理;
    TableView理解
    JavaFX表格控件渲染数据主要有两种方法: 
    1. setCellValueFactory(new PropertyValueFactory<>(“字段名”)),适合表格列数已知,有对应实体的情况(比如,学生信息,我们假定它只有姓名、性别、学号、地址、联系方式等固定字段,则适合采用此种方式进行渲染); 
    2. setCellValueFactory(new MapValueFactory<>(“对应列的键值”)),适合表格列数在渲染之前未知,需要根据传入数据的维数确定的情况,此时因为没有固定列数,所以一般数据也没有对应的实体类,数据需要用Map进行构造,一行数据就是一个Map; 
    本文主要针对列数已知的情况,Map的情况同理。

    代码DEMO
    工程目录如下图:


    Main.java

    /**
     * 实现表格的序号列的计算填充,
     * 实现按钮操作列的正常显示以及事件绑定
     */
    package application;

    import java.io.IOException;

    import javafx.application.Application;
    import javafx.fxml.FXMLLoader;
    import javafx.scene.Scene;
    import javafx.scene.layout.AnchorPane;
    import javafx.stage.Stage;

    public class Main extends Application {

        @Override
        public void start(Stage primaryStage) {
            try {
                FXMLLoader loader = new FXMLLoader();
                loader.setLocation(this.getClass().getResource("FXTable.fxml"));
                // 为表格设置控制器
                loader.setController(new TableController());
                AnchorPane rootPane = loader.load();
                Scene scene = new Scene(rootPane,506,460);
                primaryStage.sizeToScene();
                primaryStage.setScene(scene);
                primaryStage.show();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        public static void main(String[] args) {
            launch(args);
        }
    }

     


    Student.java

    package application;

    public class Student {
        private String firstName;
        private String lastName;
        private int age;

        public String getFirstName() {
            return firstName;
        }

        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }

        public String getLastName() {
            return lastName;
        }

        public void setLastName(String lastName) {
            this.lastName = lastName;
        }

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }

        public Student(String firstName, String lastName, int age) {
            this.firstName = firstName;
            this.lastName = lastName;
            this.age = age;
        }
    }

    TableController.java

    package application;

    import java.net.URL;
    import java.util.ResourceBundle;

    import javafx.collections.FXCollections;
    import javafx.collections.ObservableList;
    import javafx.fxml.FXML;
    import javafx.fxml.Initializable;
    import javafx.scene.control.Button;
    import javafx.scene.control.CheckBox;
    import javafx.scene.control.Label;
    import javafx.scene.control.TableCell;
    import javafx.scene.control.TableColumn;
    import javafx.scene.control.TableView;
    import javafx.scene.control.cell.PropertyValueFactory;
    import javafx.scene.image.ImageView;

    public class TableController implements Initializable {
        @FXML
        private Label fxLabel;
        @FXML
        private TableView<Student> stuTable;
        @FXML
        private TableColumn<Student, String> idCol, fNameCol, lNameCol, delCol;
        @FXML
        private TableColumn<Student, Integer> ageCol;
        @FXML
        private TableColumn<Student, Boolean> isAdultCol;

        public ObservableList<Student> getStuData() {

            Student stu1 = new Student("赵", "哈", 16);
            Student stu2 = new Student("钱", "大", 26);
            Student stu3 = new Student("孙", "阿", 23);
            Student stu4 = new Student("李", "佛山", 17);
            Student stu5 = new Student("周", "阿萨德", 23);
            Student stu6 = new Student("吴", "更好", 12);
            Student stu7 = new Student("郑", "和", 28);
            Student stu8 = new Student("王", "费", 23);
            Student stu9 = new Student("刘", "的", 15);
            Student stu10 = new Student("关", "时是", 23);
            Student stu11 = new Student("张", "良好", 19);
            Student stu12 = new Student("诸葛", "列", 23);
            Student stu13 = new Student("司马", "咯跑", 20);

            ObservableList<Student> stuLists = FXCollections.observableArrayList(stu1, stu2, stu3, stu4, stu5, stu6, stu7,
                    stu8, stu9, stu10, stu11, stu12, stu13);
            return stuLists;
        }

        /**
         * 显示学生表格
         * 
         * @param stuLists
         */
        public void showStuTable(ObservableList<Student> stuLists) {
            fNameCol.setCellValueFactory(new PropertyValueFactory<>("firstName"));
            lNameCol.setCellValueFactory(new PropertyValueFactory<>("lastName"));
            // ageCol.setCellValueFactory(new PropertyValueFactory<>("age"));
            idCol.setCellFactory((col) -> {
                TableCell<Student, String> cell = new TableCell<Student, String>() {
                    @Override
                    public void updateItem(String item, boolean empty) {
                        super.updateItem(item, empty);
                        this.setText(null);
                        this.setGraphic(null);

                        if (!empty) {
                            int rowIndex = this.getIndex() + 1;
                            this.setText(String.valueOf(rowIndex));
                        }
                    }
                };
                return cell;
            });

            ageCol.setCellFactory((col) -> {
                TableCell<Student, Integer> cell = new TableCell<Student, Integer>() {

                    @Override
                    public void updateItem(Integer item, boolean empty) {
                        super.updateItem(item, empty);
                        this.setText(null);
                        this.setGraphic(null);

                        if (!empty) {
                            int age = this.getTableView().getItems().get(this.getIndex()).getAge();
                            this.setText(String.valueOf(age));
                            if (age < 18) {
                                this.getStyleClass().add("mark");
                            }
                        }
                    }

                };
                return cell;
            });

            isAdultCol.setCellFactory((col) -> {
                TableCell<Student, Boolean> cell = new TableCell<Student, Boolean>() {

                    @Override
                    public void updateItem(Boolean item, boolean empty) {
                        super.updateItem(item, empty);
                        this.setText(null);
                        this.setGraphic(null);

                        if (!empty) {
                            CheckBox checkBox = new CheckBox();
                            this.setGraphic(checkBox);
                            checkBox.selectedProperty().addListener((obVal, oldVal, newVal) -> {
                                if (newVal) {
                                    // 添加选中时执行的代码
                                    System.out.println("第" + this.getIndex() + "行被选中!");
                                    // 获取当前单元格的对象
                                    // this.getItem();
                                }

                            });
                        }
                    }

                };
                return cell;
            });

            delCol.setCellFactory((col) -> {
                TableCell<Student, String> cell = new TableCell<Student, String>() {

                    @Override
                    public void updateItem(String item, boolean empty) {
                        super.updateItem(item, empty);
                        this.setText(null);
                        this.setGraphic(null);

                        if (!empty) {
                            ImageView delICON = new ImageView(getClass().getResource("delete.png").toString());
                            Button delBtn = new Button("删除", delICON);
                            this.setGraphic(delBtn);
                            delBtn.setOnMouseClicked((me) -> {
                                Student clickedStu = this.getTableView().getItems().get(this.getIndex());
                                System.out.println("删除 " + clickedStu.getFirstName() + clickedStu.getLastName() + " 的记录");
                            });
                        }
                    }

                };
                return cell;
            });

            stuTable.setItems(stuLists);
        }

        @Override
        public void initialize(URL location, ResourceBundle resources) {

            fxLabel.setWrapText(true);
            fxLabel.setText("        javafx_Label标签的换行测试,用于弹出框的提示信息测试,Label控件也可以换行。");

            this.showStuTable(this.getStuData());
        }

    }

    FXTable.fxml

    <?xml version="1.0" encoding="UTF-8"?>

    <?import javafx.scene.control.*?>
    <?import java.lang.*?>
    <?import javafx.scene.layout.*?>
    <?import javafx.scene.layout.AnchorPane?>

    <AnchorPane prefHeight="461.0" prefWidth="489.0" stylesheets="@Fxtable.css" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
       <children>
          <TableView fx:id="stuTable" layoutY="54.0" prefHeight="407.0" prefWidth="402.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="54.0">
            <columns>
                <TableColumn fx:id="idCol" prefWidth="75.0" text="序号" />
              <TableColumn fx:id="fNameCol" prefWidth="87.0" text="姓氏" />
              <TableColumn fx:id="lNameCol" prefWidth="79.0" text="名字" />
                <TableColumn fx:id="ageCol" prefWidth="73.0" text="年龄" />
                <TableColumn fx:id="delCol" prefWidth="86.0" text="删除列" />
                <TableColumn fx:id="isAdultCol" prefWidth="88.0" text="成年?" />
            </columns>
          </TableView>
          <Label fx:id="fxLabel" layoutY="-1.0" prefHeight="56.0" prefWidth="402.0" />
       </children>
    </AnchorPane>


    运行截图:


    实现描述:
    实体类里面无ID字段,表格做数据展示的时候临时构造顺序ID列数据;
    删除操作列的渲染,并且添加单击事件,能够实时响应删除动作;
    年龄一列的个性化显示,未成年年龄显示为红色字体;
    另,DEMO源码可以向原版作者要,以下链接是原文出处
    --------------------- 
    作者:M-Chung 
    来源:CSDN 
    原文:https://blog.csdn.net/mrchung2016/article/details/71774496 
    版权声明:本文为博主原创文章,转载请附上博文链接!

    展开全文
  • 1. 问题的背景下面这样的一个表格是工作过程中常见的在这个表格中,列有不同的属性,同样表格,对于设计人员自身是应该全部可见,但是当需要把表格的部分内容分享给...因此,把需要隐藏的列删除是必要的。以下界面...

    1. 问题的背景

    下面这样的一个表格是工作过程中常见的

    e10148cf83e6267a31300ca58c114e27.png

    在这个表格中,列有不同的属性,同样表格,对于设计人员自身是应该全部可见,但是当需要把表格的部分内容分享给业主,其他设计单位,供货商的时候,数据就需要有所取舍了,主要有两个方面的考虑,其一是保密的需要,有些数据不方便提供的,需要隐藏或者删除;其二则是有些数据对非设计人员没有用处,清除无关数据更方便对方使用。因此,把需要隐藏的列删除是必要的。

    以下界面就十分清楚简单了

    4e4e455d74fcf9bc9b8a36c505819cc7.png

    但是这样的表格还存在一个问题,就是可以通过右键取消隐藏,最好的办法是把不需要显示的数据列删除,问题是"公开"的列,"隐藏"的列,"保密"的列是离散分布的,手动删除的操作还是比较难以操作的。

    最理想的是有一个所见即所得的功能,即当前界面调整完成后,自动的删除隐藏的状态的数据列。

    2. 问题的解决

    首先,运行《电气设计辅助程序(EDAP)正式版6.0@2019.03.03-02程序》

    运行后在Excel界面出现如下选项卡:

    b8c334bcc7d28fd1f856eaae99e1dca5.png

    点击通用工具

    c789291ce46962897506997b57ba7aa4.png

    再选择单元工具,执行"删除隐藏的列"功能

    e5a8f6503e735c457e895b7de537e585.png

    并在对话框中输入当前表格最大的使用列数(为了避免遍历所有列,提高处理速度,可以输入一个足够大的数字即可)

    a1e319b4a7f41fe5a06ee169e312de78.png

    点击确认即可完成操作。

    152f34136cbda9688a740a94f63a0adb.png

    公开的列依次变化为ABCDEFG,不需要出现的内容已经搞定。

    展开全文
  • 1 要解决问题:删除空单元格/空行暂时只实现了删除空行,并没有实现多行判断空行和删除方法。----之后再做更复杂1.1 需求分析用VBA删除如下内容,解决思路都不同删除1列的空行(本文要做)...

    d028b028b34d74d0282b04957bf7b6c5.png

    1 要解决的问题:删除某列中的空单元格/空行

    暂时只实现了删除一列中的空行,并没有实现多行的判断空行和删除方法。----之后再做更复杂的

    1.1 需求分析

    用VBA删除如下内容,解决思路都不同

    1. 删除1列的空行(本文要做的)
    2. 删除整个区域内的空行
    3. 删除整个区域内的空格(这个一般很少有这种需求,用处不大----可用currentregion .specialcells()解决)
    4. 下面是原始数据,下面看看如何处理

    b5e432c6e31ae5a69d9e54459414deba.png

    2 如果是删除全表/某区域的空单元格, 直接在当前列删除

    简洁代码:删除区域内所有空单元格 cells ---实际需要少,so用处不大

    使用 sheet.usedrange / region.currentregion .specialcells()

    • 删除,表格页面内使用区域的空格所在的行
    • 局限性就是表格的上方,左边还会存在一些空行空列,不过这个手动删下就可以了
    • 这个只是删除了空的cells 并不是删除了空行
    Sub 删空单元格()
    ActiveSheet.UsedRange.SpecialCells(xlCellTypeBlanks).Delete
    End Sub

    3 如果是删一列的空行

    3.1 代码1:基础代码,假设确认知道这列的长度,关键是倒着删

    • 熟悉 isempty() 或者用 if xxxx=""
    • 删除单元格后,要设置属性 shift:=xlup等
    • 需要倒着删除,否则会因为一边删除行,一遍重新排列有问题
    Sub 删一列的空行()
    For i = 20 To 1 Step -1 '需要倒着删除
    If IsEmpty(Cells(i, 1)) Then
    Cells(i, 1).Delete shift:=xlUp
    End If
    Next i
    End Sub

    3.2 改进版: 先查这一列的非空最大行数

    Sub jackma_delete_row()
    For i = Range("c65536").End(xlUp).Rows To 1 Step -1
    If IsEmpty(Cells(i, 3)) Then
    rows(i).Delete shift:=xlUp
    End If
    Next i
    End Sub

    3.3 也可以不用 isempty() 函数,直接判断 if cells()=""

    • 直接判断 if cells(i,j) =""
    • 这种删除整行不合适 rows(i) .delete,会影响其他列的元素
    Sub ponyma_del_row1()
    For i = Range("c65536").End(xlUp).Row To 1 Step -1
    If Cells(i, 3) = "" Then
    Cells(i, 3).Delete
    ' Rows(i).Delete
    End If
    Next i
    End Sub

    4 不动原数据,将非空数据放到另外一列

    4.1 错误版:

    要明白“写入列”的循环数,明显和“输出列”的循环数 应该不同!
    这么写相当于 输出列 那行为空的时候,只是不往 写入列写,所以没覆盖,也是空的
    Sub jackma_delete_row2()
    For i = 1 To Range("c65536").End(xlUp).Rows
    If Not IsEmpty(Cells(i, 3)) Then
    Cells(i, 9) = Cells(i, 3)
    End If
    Next i
    End Sub

    4.2 正确版: 写入列/输出列,应该是单独的循环变量!

    Sub jackma_delete_row2()
    k = 1
    For i = 1 To Range("c65536").End(xlUp).Rows
    If Not IsEmpty(Cells(i, 3)) Then
    Cells(k, 9) = Cells(i, 3)
    k = k + 1
    End If
    Next i
    End Sub

    5 先写入数组array中,再写到其他地方,据说这样能大幅提高速度!

    把需要的筛选的数据,存在数据,然后从数组写到需要的地方,这是个好习惯

    第1版:局限性很大,没有自动查这列的 元素个数,以及 最大非空行是多少

    Sub 删除空格4()
    Dim arr1() '定义了一个数组,并且是动态数组,因为没指定大小
    ReDim arr1(11) '动态数组,使用前必须重新redim,数组大小
    j = 0 'j=1开始,不会越界,但arr1(0)为空,因为赋值跳过了它
    For i = 1 To 11 Step 1
    If Not IsEmpty(Cells(i, 1)) Then
    arr1(j) = Cells(i, 1)
    j = j + 1
    End If
    Next i
    For j = 0 To UBound(arr1())
    Cells(j + 1, 9) = arr1(j) '单元格得从1开始,arr(),默认得从0开始,但可以改
    Next j
    End Sub

    第2版重写

    注意debug.print用来监测的时候,需要注意,放在循环的位置,尤其是在k=K+1这种变化时,和放在哪个for循环之内外!

    Sub ponyma_array22()
    Dim arr1() '当数组定义,且默认开始的index为0! preserve时需要有0的index
    'dim arr1 当变量定义
    k = 1
    m = 1
    ReDim arr1(0 To Application.WorksheetFunction.CountA(Range("c:c")))
    For i = 1 To Range("c65536").End(xlUp).Row Step 1
    If Cells(i, 3) <> "" Then
    Debug.Print Cells(i, 3)
    arr1(k) = Cells(i, 3)
    Debug.Print arr1(k)
    k = k + 1
    ' Debug.Print arr1(k),写在这里问题1:k已经变了,下一个k还没赋值为空,2最后的k越界
    ' 循环是很精巧的,放的地方很讲究,放得不对,就错误百出
    ' Debug.Print arr1(k) 如果放在k=K+1 后,就看起来没打印出东西,因为都打印的arr1的空元素
    End If
    Next i
    For j = 1 To UBound(arr1(), 1)
    Cells(m, 10) = arr1(j)
    m = m + 1
    Next j
    End Sub

    第3版

    Option Explicit
    Sub ponyma1()
    Dim arr1()
    Dim k1, k2, k
    Dim i, j
    k1 = WorksheetFunction.CountA(Range("a:a"))
    k2 = Range("a65536").End(xlUp).Row
    Debug.Print "这列非空数据个数k1=" & k1
    Debug.Print "这列最后1个有数据的行数k2=" & k2
    'arr1(0) = 1
    'ReDim Preserve arr1(1, k)
    '这样会越界,因为你需要preserve数据。但是index系不符合
    '但是,如果不preserve 就无所谓
    '或者虽然 dim arr1() 是动态数据从index0开始,但是arr1()一直为空,preserve也不会出现index越界问题
    ReDim Preserve arr1(1 To k1)
    'ReDim Preserve arr1(1, k1) 这样就会越界。。。因为语法是2维数组了!
    'ReDim Preserve arr1(1 to k1) 这样就对的
    k = 1
    For i = 1 To k2
    If Cells(i, 1) <> "" Then
    arr1(k) = Cells(i, 1)
    Debug.Print arr1(k)
    k = k + 1
    End If
    Next i

    ————————————————

    版权声明:本文为CSDN博主「奔跑的犀牛先生」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

    原文链接:【原创】VBA(实验1)用VBA 删除某列空单元格的3种方法:删除法,转移到其他列方法,数组方法

    展开全文
  • 暂时只实现了删除空行,并没有实现多行判断空行和删除方法。----之后再做更复杂 1.1需求分析 用VBA删除如下内容,解决思路都不同 删除1列的空行(本文要做删除整个区域内空行 删除整个...
  • VBA编程经常和“对象”打交道,其中最频繁对象大概就是“单元格”了。(听说您还没有对象?...1,当前表所有单元格Cells.ClearContents 清空当前表所有单元格的内容2,当前活动单元格ActiveCell...
  • 1. 某些不插入内容,值是多少?自动填充NULL2. NOT NULL是干嘛?不能为NULL类型,因为NULL类型查询时候需要加语句 IS NULL 或者IS NOT NULL效率低,查询速度慢,开发中我们一般不可以设置为默认能插入NULL类型...
  • 1. 某些不插入内容,值是多少?自动填充NULL2. NOT NULL是干嘛?不能为NULL类型,因为NULL类型查询时候需要加语句 IS NULL 或者IS NOT NULL效率低,查询速度慢,开发中我们一般不可以设置为默认能插入NULL类型...
  • 关于重复项,有整行内容重复,也有部分内容重复,就像下图左边表格,有三个“张三”和两个“王五”,怎样变成右边那个没有重复项表格呢?如果只有一部分列的内容重复,其他列的内容不重复又怎么处理呢?...
  • 1、如果这张表没有主键(或者相同行并没有不相同的内容列),则需要新建一个自增,用来区分不同。例如 代码如下: alter table [tablename] add [TID] int IDENTITY(1,1) 就是增加一个自增量临时TID。 为啥...
  • 1. 某些不插入内容,值是多少? 自动填充NULL2. NOT NULL是干嘛? 不能为NULL类型,因为NULL类型查询时候需要加语句 IS NULL 或者IS NOT NULL 效率低,查询速度慢,开发中我们一般不可以设置为默认能插入...
  • 一、定位 格式全选。TAB键将光标移到空。Ctrl+G 定位工具 定位条件 行内容差异单元格。...2.定位 空值 填充1 (数据里没有的任何字符,便于区分)3.筛选1 删除 。4.复制,选择性粘贴 ,转置 。 转载于:ht...
  • 这时候想把这些数据弄成一个C语言数组,这时候第一步看到最大麻烦就是,这些数据之间都没有换行,这就十分难弄,如果数据很多很多,那分行工作就十分繁重,这时候就要想到使用工具了,这里先把这些数据弄成16...
  • 刚解决小问题,之前也解决过类似问题,但这次还设计到用SQL语句加一,平时不常用...1、如果这张表没有主键(或者相同行并没有不相同的内容列),则需要新建一个自增,用来区分不同。例如alter table [tab
  • datatable中并没有直接可以使用函数. 思路如下: ...3.依然使用datatable读取isFraud.csv的内容,然后在尾部追加isFraud 代码如下: import datatable as dt folder_path = './' fraud_...
  • 1、选中需要删除重复项的列,点击数据栏下的删除重复项 2、在弹出的删除重复项对话框中,选择需要处理的列后,点击确定;这时列已经变成没有重复项的列了 ...
  • 想实现ListView在详细资料视图下列的隐藏,网上搜了一下实现方法,发现不外乎两种方法,一种是删除列,这是真正的隐藏...于是看第二种方法:把列宽设为0,这样看上去是隐藏了,也没有修改单元格内容的麻烦,但是用户拖
  • 在data最后一加上删除和修改按钮,自己加了之后一直报数据项错误,麻烦大佬帮下忙 ``` <!DOCTYPE html> 二十九师信息 , initial-scale=1"> ...
  • 给定一个输入文件,称为“input.csv”,如下所示:A,B,c_net,d,e_net0,0,1,0,10,0,1,0,1(删除其间空白行,它们只是用于格式化这篇文章中的内容)以下代码可以满足您需求.import csvinput_filename = 'input.csv'...
  • 也为您应用添加注册表并发送合并请求! 关于 这是我制作一个简单脚本,用于清除安装新程序时添加那些烦人上下文菜单项,甚至不问您,而是在右键单击任何内容时显示... ...我没有安装脚本中所有应用程序。
  • 首先,打开待处理Excel表格工作薄,进入编辑状态,选中第一行,再选择“筛选”按钮,如图红色箭头所示:在筛选中,选择不想要数据内容,如“水车”没有方量,想要全部删除,在B强度等级中筛选内容窗口只勾选...
  • 昨天需要处理一个Excel文件,删除一堆英文里汉字,开始搜了下方法,没找到,然后手动一个多小时,弄了一半吧也就,结果电脑卡了,忘了保存,就白做了。...因为每个单元格内容太多,怕出错,就一列列处理再放...
  • 第一种:有主键重复行,就是说主键不重复,但是记录的内容重复比如人员表tab ,主键id,身份证编号idcard当身份证重复时候,保留最小id值记录,其他删除delete a from tab a where exists(select 1 from tab...
  • ------ 2015年12月2日09:02:09 更新 ------------由于我没有深入研究过 MySQL 源码,以下内容纯属猜测。我看了你截图,表都是 MyISAM 。在第一次插入数据时候,数据都是连续存储(物理存储)。当 MySQL 删除...
  • 选择数据区域内容最多的一列(避免删除有用信息,因为有的列有部分值没有,但是这列数据依然有效) 按F5调出定位功能对话框 定位条件选择空值 然后在开始菜单中,找到删除 删除工作表行 ...
  • 然后第一行是题干,需要将第一行题干去掉,然后内容用双层for循环进行遍历,找到相同内容的题干号,从而删除相同的题号(目前没有尝试在python中删除内容相同的行,只是查询到,然后手动在Excel里面删除。...
  • lprm 命令 Linux lprm命令用于将一个工作由打印机贮中移除 尚未完成打印机工作会被放在...这个命令会检查使用者是否有足够权限删除指定档案,一般而言,只有档案拥有者或是系统管理员才有这个权限。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 520
精华内容 208
关键字:

删除没有内容的列