To solve this problem, we need to formulate a linear programming model that captures the constraints and objectives described. The decision variables are the number of peanut butter sandwiches (x) and the number of chocolate spread sandwiches (y). The objective is to maximize profit, which is $3 per peanut butter sandwich and $2 per chocolate spread sandwich.

The constraints are as follows:
1. The store can make at most 150 sandwiches in total: x + y ≤ 150.
2. They must sell at least 45 peanut butter sandwiches: x ≥ 45.
3. They must sell at least 65 chocolate spread sandwiches: y ≥ 65.
4. They only have enough spread to make at most 80 peanut butter sandwiches: x ≤ 80.
5. They only have enough spread to make at most 100 chocolate spread sandwiches: y ≤ 100.

Given these constraints, the linear programming formulation can be represented as:
Maximize: 3x + 2y
Subject to:
- x + y ≤ 150 (Total sandwiches constraint)
- x ≥ 45 (Minimum peanut butter sandwiches)
- y ≥ 65 (Minimum chocolate spread sandwiches)
- x ≤ 80 (Maximum peanut butter sandwiches due to spread limit)
- y ≤ 100 (Maximum chocolate spread sandwiches due to spread limit)
- x, y ≥ 0 (Non-negativity constraint, as you cannot sell a negative number of sandwiches)

This problem can be solved using Gurobi in Python. The code will define the model, add the variables and constraints, set the objective function, and then solve the model.

```python
from gurobipy import *

# Create a new model
m = Model("Sandwich_Problem")

# Define the decision variables
x = m.addVar(lb=45, ub=80, name="Peanut_Butter_Sandwiches")  # Minimum and maximum bounds for peanut butter sandwiches
y = m.addVar(lb=65, ub=100, name="Chocolate_Spread_Sandwiches")  # Minimum and maximum bounds for chocolate spread sandwiches

# Set the objective function: Maximize profit
m.setObjective(3*x + 2*y, GRB.MAXIMIZE)

# Add constraints
m.addConstr(x + y <= 150, "Total_Sandwiches")

# Optimize model
m.optimize()

# Print solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Peanut Butter Sandwiches: {x.x}")
    print(f"Chocolate Spread Sandwiches: {y.x}")
    print(f"Total Profit: {m.objVal}")
else:
    print("No optimal solution found")
```