To solve this optimization problem, we need to define the decision variables, the objective function, and the constraints.

Let's denote:
- $x_1$ as the number of office chairs to stock,
- $x_2$ as the number of dining chairs to stock.

The profit per office chair is $120, and the profit per dining chair is $180. Therefore, the total profit can be represented as $120x_1 + 180x_2$.

The cost of an office chair is $200, and the cost of a dining chair is $250. The company does not want to invest more than $20,000 on chairs. This constraint can be represented as $200x_1 + 250x_2 \leq 20000$.

Additionally, the company estimates a monthly demand of at most 130 total chairs. This gives us another constraint: $x_1 + x_2 \leq 130$.

Since we cannot stock a negative number of chairs, we also have non-negativity constraints: $x_1 \geq 0$ and $x_2 \geq 0$.

Now, let's translate this problem into Gurobi code in Python:

```python
from gurobipy import *

# Create a model
m = Model("chair_stocking")

# Define the decision variables
x1 = m.addVar(lb=0, vtype=GRB.INTEGER, name="office_chairs")
x2 = m.addVar(lb=0, vtype=GRB.INTEGER, name="dining_chairs")

# Define the objective function: maximize profit
m.setObjective(120*x1 + 180*x2, GRB.MAXIMIZE)

# Add constraints
m.addConstr(200*x1 + 250*x2 <= 20000, "budget_constraint")
m.addConstr(x1 + x2 <= 130, "demand_constraint")

# Optimize the model
m.optimize()

# Print the solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Stock {x1.x} office chairs and {x2.x} dining chairs")
    print(f"Maximum profit: ${120*x1.x + 180*x2.x}")
else:
    print("No optimal solution found")

```